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
| Label | Meaning |
|---|---|
| Key | The scope an integration key needs. — means integration keys can't call it. |
| People | The 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. |
| Feature | The 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 acceptupdatedSince. - Resources with an
externalIdcan be read and upserted at…/external/{externalId}. DELETEarchives (soft delete); history is kept.PATCHis a JSON merge patch and acceptsIf-Matchwith the record'sversion.- Batch endpoints (
202) are idempotent onsource+externalIdand return per-record results. See Data ingestion. - Actions on a record use a colon:
POST /employees/{id}:terminate.
Browse by area
Search all endpoints
Authentication
Open reference →- GET
/auth/api-keysYour personal API keys
Keynot allowedPeopleself (session) - POST
/auth/api-keysCreate a personal API key
Keynot allowedPeopleapi_keys.personal(session) - DELETE
/auth/api-keys/{id}Revoke one of your personal API keys
Keynot allowedPeopleself (session) - POST
/auth/invitations:acceptAccept an invitation and set a password
KeypublicPeoplepublic - POST
/auth/magic-linkEmail a single-use sign-in link
KeypublicPeoplepublic - POST
/auth/magic-link:redeemSign in with a magic link
KeypublicPeoplepublic - POST
/auth/mfa/recovery-codes:regenerateReplace your recovery codes
Keynot allowedPeopleself (session) - POST
/auth/mfa/totp:confirmTurn on two-factor authentication with a first code
Keynot allowedPeopleself (session) - POST
/auth/mfa/totp:disableTurn off two-factor authentication
Keynot allowedPeopleself (session) - POST
/auth/mfa/totp:setupStart setting up an authenticator app
Keynot allowedPeopleself (session) - POST
/auth/passwordChange your password
Keynot allowedPeopleself (session) - POST
/auth/password-resetEmail a password reset link
KeypublicPeoplepublic - POST
/auth/password-reset:completeChoose a new password with a reset link
KeypublicPeoplepublic - GET
/auth/sessionThe signed-in person: role, permissions, assignments and enabled features
Keynot allowedPeopleself - GET
/auth/sessionsYour active sessions and devices
Keynot allowedPeopleself (session) - DELETE
/auth/sessions/{id}Sign out one of your sessions
Keynot allowedPeopleself (session) - POST
/auth/sign-inSign in with email and password
KeypublicPeoplepublic - POST
/auth/sign-in/mfaFinish signing in with an authenticator or recovery code
Keynot allowedPeopleself (session) - POST
/auth/sign-outSign out this session
Keynot allowedPeopleself (session)
Users & Roles
Open reference →- POST
/rolesCreate a role
Keynot allowedPeopleroles.manage(Everyone) - PATCH
/roles/{id}Change a role
Keynot allowedPeopleroles.manage(Everyone) - DELETE
/roles/{id}Delete a role
Keynot allowedPeopleroles.manage(Everyone) - GET
/settings/authenticationSign-in settings
Keynot allowedPeoplesettings.manage(Everyone) - PATCH
/settings/authenticationChange sign-in settings
Keynot allowedPeoplesettings.manage(Everyone) - POST
/usersInvite someone
Keynot allowedPeopleusers.manage(Everyone) - PATCH
/users/{id}Change someone's name, role, employee link or assignments
Keynot allowedPeopleusers.manage(Everyone) - POST
/users/{id}:deactivateDeactivate an account
Keynot allowedPeopleusers.manage(Everyone) - POST
/users/{id}:reactivateReactivate an account
Keynot allowedPeopleusers.manage(Everyone) - POST
/users/{id}:reset-sign-inReset someone's sign-in
Keynot allowedPeopleusers.manage(Everyone)
Platform
Open reference →- GET
/featuresFeatures and whether they are enabled
Keyany keyPeopleanyone - GET
/meThe calling API key
Keyany keyPeopleanyone - GET
/openapi.jsonOpenAPI document for enabled features
KeypublicPeoplepublic - GET
/permissionsPermission catalog for enabled features
Keyany keyPeopleanyone
Integration self-service
Open reference →- GET
/integrations/selfThe calling integration's registration
Keyintegration keyPeoplenot allowed - GET
/integrations/self/configConfig values entered by the admin
Keyintegration keyPeoplenot allowed - POST
/integrations/self/healthSend a heartbeat and status message
Keyintegration keyPeoplenot allowed - POST
/integrations/self/logsAdd a log message to the integration's log
Keyintegration keyPeoplenot allowed
Integrations
Open reference →- GET
/integrationsList integrations;
statusfiltersKeynot allowedPeopleintegrations.manage(Everyone) - POST
/integrationsRegister an integration from its manifest; returns its API key and webhook secret once
Keynot allowedPeopleintegrations.manage(Everyone) - GET
/integrations/{id}An integration with its manifest, config (secrets masked), API keys and webhook endpoints
Keynot allowedPeopleintegrations.manage(Everyone) - DELETE
/integrations/{id}Remove an integration with its keys, config, logs and webhook endpoint
Keynot allowedPeopleintegrations.manage(Everyone) - PUT
/integrations/{id}/manifestReplace its manifest, e.g. for a new version
Keynot allowedPeopleintegrations.manage(Everyone) - PATCH
/integrations/{id}/configChange config values (
nullremoves one)Keynot allowedPeopleintegrations.manage(Everyone) - POST
/integrations/{id}:pausePause it: its keys are refused and its webhooks wait
Keynot allowedPeopleintegrations.manage(Everyone) - POST
/integrations/{id}:resumeResume it
Keynot allowedPeopleintegrations.manage(Everyone) - POST
/integrations/{id}:rotate-keyIssue a new API key; the old ones keep working for
graceMinutesKeynot allowedPeopleintegrations.manage(Everyone) - GET
/integrations/{id}/logsMessages it logged;
levelandfromfilterKeynot allowedPeopleintegrations.manage(Everyone) - GET
/integrations/{id}/batchesIngestion batches it sent, with created, updated and rejected counts;
fromandrejectedOnlyfilterKeynot allowedPeopleintegrations.manage(Everyone)
Attachments
Open reference →- GET
/attachmentsList attachments
Keyattachments:readPeopleattachments.read - POST
/attachmentsUpload a file
Keyattachments:writePeopleanyone - GET
/attachments/{id}Get an attachment's details
Keyattachments:readPeopleuploader, the employee concerned, orattachments.read - DELETE
/attachments/{id}Delete an attachment
Keyattachments:writePeopleuploader, orattachments.manage - GET
/attachments/{id}/contentDownload an attachment
Keyattachments:readPeopleuploader, the employee concerned, orattachments.read - GET
/me/attachmentsFiles you uploaded or that concern you
Keynot allowedPeopleself
Organization
Open reference →- GET
/org-unitsList org units (regions, districts…);
parentIdfiltersKeyorganization:readPeopleanyone - POST
/org-unitsCreate an org unit
Keyorganization:writePeopleorganization.manage(Everyone) - GET
/org-units/{id}Get an org unit
Keyorganization:readPeopleanyone - PATCH
/org-units/{id}Update an org unit (e.g. move it under another parent)
Keyorganization:writePeopleorganization.manage(Everyone) - DELETE
/org-units/{id}Archive an org unit (only once it contains no active units or locations)
Keyorganization:writePeopleorganization.manage(Everyone) - GET
/org-units/external/{externalId}Get an org unit by external ID
Keyorganization:readPeopleanyone - PUT
/org-units/external/{externalId}Create or replace an org unit by external ID
Keyorganization:writePeopleorganization.manage(Everyone) - GET
/locationsList locations;
orgUnitId,statusandincludeArchivedfilterKeyorganization:readPeopleanyone - POST
/locationsCreate a location
Keyorganization:writePeopleorganization.manage(Everyone) - GET
/locations/{id}Get a location
Keyorganization:readPeopleanyone - PATCH
/locations/{id}Update a location's profile
Keyorganization:writePeopleorganization.manage - DELETE
/locations/{id}Archive (close) a location; history is kept
Keyorganization:writePeopleorganization.manage - GET
/locations/external/{externalId}Get a location by external ID
Keyorganization:readPeopleanyone - PUT
/locations/external/{externalId}Create or replace a location by external ID
Keyorganization:writePeopleorganization.manage(Everyone) - GET
/departmentsList departments
Keyorganization:readPeopleanyone - POST
/departmentsCreate a department
Keyorganization:writePeopleorganization.manage(Everyone) - GET
/departments/{id}Get a department
Keyorganization:readPeopleanyone - PATCH
/departments/{id}Update a department
Keyorganization:writePeopleorganization.manage(Everyone) - DELETE
/departments/{id}Archive a department
Keyorganization:writePeopleorganization.manage(Everyone) - GET
/departments/external/{externalId}Get a department by external ID
Keyorganization:readPeopleanyone - PUT
/departments/external/{externalId}Create or replace a department by external ID
Keyorganization:writePeopleorganization.manage(Everyone) - GET
/rolesList roles and their permissions
Keyorganization:readPeopleusers.read - GET
/roles/{id}Get a role
Keyorganization:readPeopleusers.read - GET
/usersList user accounts with their role and assignments
Keyorganization:readPeopleusers.read - GET
/users/{id}Get a user
Keyorganization:readPeopleusers.read
People & HR
Open reference →- GET
/employeesList employees
Keypeople:readPeopleemployees.readFeaturepeople - POST
/employeesCreate an employee
Keypeople:writePeopleemployees.writeFeaturepeople - GET
/employees/external/{externalId}Get an employee by external ID
Keypeople:readPeopleemployees.readFeaturepeople - PUT
/employees/external/{externalId}Create or replace an employee by external ID
Keypeople:writePeopleemployees.writeFeaturepeople - GET
/employees/{employeeId}/documentsList employee documents
Keypeople:readPeopledocuments.readFeaturepeople.documents - POST
/employees/{employeeId}/documentsCreate an employee document
Keypeople:writePeopledocuments.manageFeaturepeople.documents - GET
/employees/{employeeId}/documents/{id}Get an employee document
Keypeople:readPeopledocuments.readFeaturepeople.documents - PATCH
/employees/{employeeId}/documents/{id}Update an employee document (partial)
Keypeople:writePeopledocuments.manageFeaturepeople.documents - DELETE
/employees/{employeeId}/documents/{id}Archive an employee document
Keypeople:writePeopledocuments.manageFeaturepeople.documents - GET
/employees/{id}Get an employee
Keypeople:readPeopleemployees.readFeaturepeople - PATCH
/employees/{id}Update an employee (partial)
Keypeople:writePeopleemployees.writeFeaturepeople - DELETE
/employees/{id}Archive an employee
Keypeople:writePeopleemployees.writeFeaturepeople - GET
/employees/{id}/pay-ratesPay rate history (newest first)
Keypayroll:readPeoplepay.readFeaturepeople - POST
/employees/{id}/pay-ratesAdd a pay rate
Keypayroll:writePeoplepay.writeFeaturepeople - GET
/employees/{id}/skillsAn employee's skills and certifications
Keypeople:readPeopleemployees.readFeaturepeople.skills - PUT
/employees/{id}/skills/{skillId}Give an employee a skill or certification
Keypeople:writePeopleskills.manageFeaturepeople.skills - DELETE
/employees/{id}/skills/{skillId}Remove a skill from an employee
Keypeople:writePeopleskills.manageFeaturepeople.skills - POST
/employees/{id}:rehireRehire a terminated employee
Keypeople:writePeopleemployees.writeFeaturepeople - POST
/employees/{id}:terminateTerminate an employee
Keypeople:writePeopleemployees.writeFeaturepeople - POST
/employees/{id}:transferTransfer an employee (location, department, position or manager)
Keypeople:writePeopleemployees.writeFeaturepeople - GET
/payslipsList payslips
Keypayroll:readPeoplepay.readFeatureemployee_area.payslips - POST
/payslipsSend payslips from your payroll provider
Keypayroll:writePeoplenot allowedFeatureemployee_area.payslips - GET
/skillsList skills
Keypeople:readPeopleemployees.readFeaturepeople.skills - POST
/skillsCreate a skill
Keypeople:writePeopleskills.manageFeaturepeople.skills - GET
/skills/external/{externalId}Get a skill by external ID
Keypeople:readPeopleemployees.readFeaturepeople.skills - PUT
/skills/external/{externalId}Create or replace a skill by external ID
Keypeople:writePeopleskills.manageFeaturepeople.skills - GET
/skills/{id}Get a skill
Keypeople:readPeopleemployees.readFeaturepeople.skills - PATCH
/skills/{id}Update a skill (partial)
Keypeople:writePeopleskills.manageFeaturepeople.skills - DELETE
/skills/{id}Archive a skill
Keypeople:writePeopleskills.manageFeaturepeople.skills
Time & Attendance
Open reference →- GET
/labor-rule-setsList labor rule sets
Keytime:readPeopletimesheets.readFeaturetime - POST
/labor-rule-setsCreate a labor rule set
Keytime:writePeoplelabor_rules.manageFeaturetime - GET
/labor-rule-sets/{id}Get a labor rule set
Keytime:readPeopletimesheets.readFeaturetime - PATCH
/labor-rule-sets/{id}Update a labor rule set (partial)
Keytime:writePeoplelabor_rules.manageFeaturetime - GET
/pay-periodsList pay periods (newest first)
Keypayroll:readPeopletimesheets.readFeaturetime - POST
/pay-periodsCreate a pay period
Keypayroll:writePeoplepay_periods.lockFeaturetime - GET
/pay-periods/{id}Get a pay period
Keypayroll:readPeopletimesheets.readFeaturetime - GET
/pay-periods/{id}/exportExport hours for payroll
Keypayroll:readPeoplepayroll.exportFeaturetime.payroll_export - POST
/pay-periods/{id}:lockLock a pay period (final payroll approval)
Keypayroll:writePeoplepay_periods.lockFeaturetime - GET
/punch-correctionsList punch corrections
Keytime:readPeoplepunches.correctFeaturetime - POST
/punch-corrections/{id}:approveApprove a punch correction
Keytime:writePeoplepunches.correctFeaturetime - POST
/punch-corrections/{id}:rejectReject a punch correction
Keytime:writePeoplepunches.correctFeaturetime - POST
/time-off/adjustmentsAdd or deduct time-off hours (accruals, corrections)
Keytime:writePeopletime_off.approveFeaturetime.time_off - GET
/time-off/balancesTime-off balances per employee and type
Keytime:readPeopletime_off.readFeaturetime.time_off - GET
/time-off/requestsList time-off requests
Keytime:readPeopletime_off.readFeaturetime.time_off - POST
/time-off/requestsRequest time off
Keytime:writePeopletime_off.approveFeaturetime.time_off - POST
/time-off/requests/{id}:approveApprove a time-off request (deducts the balance)
Keytime:writePeopletime_off.approveFeaturetime.time_off - POST
/time-off/requests/{id}:cancelCancel a time-off request (restores the balance if it was approved)
Keytime:writePeopletime_off.approveFeaturetime.time_off - POST
/time-off/requests/{id}:rejectReject a time-off request
Keytime:writePeopletime_off.approveFeaturetime.time_off - GET
/time-off/typesList time off types
Keytime:readPeopleanyoneFeaturetime.time_off - POST
/time-off/typesCreate a time off type
Keytime:writePeoplesettings.manageFeaturetime.time_off - GET
/time-off/types/external/{externalId}Get a time off type by external ID
Keytime:readPeopleanyoneFeaturetime.time_off - PUT
/time-off/types/external/{externalId}Create or replace a time off type by external ID
Keytime:writePeoplesettings.manageFeaturetime.time_off - GET
/time-off/types/{id}Get a time off type
Keytime:readPeopleanyoneFeaturetime.time_off - PATCH
/time-off/types/{id}Update a time off type (partial)
Keytime:writePeoplesettings.manageFeaturetime.time_off - DELETE
/time-off/types/{id}Archive a time off type
Keytime:writePeoplesettings.manageFeaturetime.time_off - GET
/time/punchesList punches
Keytime:readPeoplepunches.readFeaturetime - POST
/time/punches:batchSend punches in bulk
Keytime:writePeoplenot allowedFeaturetime - GET
/timesheetsList timesheets
Keytime:readPeopletimesheets.readFeaturetime - GET
/timesheets/{id}Get a timesheet with daily detail and exceptions
Keytime:readPeopletimesheets.readFeaturetime - POST
/timesheets/{id}:approveApprove a timesheet (manager step)
Keytime:writePeopletimesheets.approveFeaturetime - POST
/timesheets/{id}:rejectReject a timesheet
Keytime:writePeopletimesheets.approveFeaturetime - POST
/timesheets:buildBuild or refresh timesheets from punches
Keytime:writePeopletimesheets.approveFeaturetime
Scheduling & Forecasting
Open reference →- GET
/availabilityList availabilitys
Keyscheduling:readPeopleschedules.readFeaturescheduling - POST
/availabilityCreate an availability
Keyscheduling:writePeopleschedules.manageFeaturescheduling - GET
/availability/{id}Get an availability
Keyscheduling:readPeopleschedules.readFeaturescheduling - PATCH
/availability/{id}Update an availability (partial)
Keyscheduling:writePeopleschedules.manageFeaturescheduling - DELETE
/availability/{id}Archive an availability
Keyscheduling:writePeopleschedules.manageFeaturescheduling - POST
/demand-driversSend demand drivers (appointments, foot traffic, orders…)
Keyscheduling:writePeoplenot allowedFeaturescheduling - GET
/forecastsForecast a demand driver
Keyscheduling:readPeopleforecasts.readFeaturescheduling.forecasting - POST
/forecasts/adjustmentsAdjust a day's forecast by a percentage
Keyscheduling:writePeopleforecasts.manageFeaturescheduling.forecasting - GET
/schedulesA location's schedule with hours and estimated cost
Keyscheduling:readPeopleschedules.readFeaturescheduling - POST
/schedules:publishPublish draft shifts for a location and period
Keyscheduling:writePeopleschedules.publishFeaturescheduling - GET
/shift-swapsList shift swap requests
Keyscheduling:readPeopleschedules.readFeaturescheduling.shift_swaps - POST
/shift-swapsRequest a shift swap
Keyscheduling:writePeopleschedules.manageFeaturescheduling.shift_swaps - POST
/shift-swaps/{id}:approveApprove a swap (reassigns the shift)
Keyscheduling:writePeopleshift_swaps.approveFeaturescheduling.shift_swaps - POST
/shift-swaps/{id}:rejectReject a swap
Keyscheduling:writePeopleshift_swaps.approveFeaturescheduling.shift_swaps - GET
/shiftsList shifts
Keyscheduling:readPeopleschedules.readFeaturescheduling - POST
/shiftsCreate a shift
Keyscheduling:writePeopleschedules.manageFeaturescheduling - GET
/shifts/external/{externalId}Get a shift by external ID
Keyscheduling:readPeopleschedules.readFeaturescheduling - PUT
/shifts/external/{externalId}Create or replace a shift by external ID
Keyscheduling:writePeopleschedules.manageFeaturescheduling - GET
/shifts/{id}Get a shift
Keyscheduling:readPeopleschedules.readFeaturescheduling - PATCH
/shifts/{id}Update a shift (partial)
Keyscheduling:writePeopleschedules.manageFeaturescheduling - POST
/shifts/{id}:claimAssign an open shift to an employee
Keyscheduling:writePeopleschedules.manageFeaturescheduling.open_shifts - GET
/staffing-needsStaff needed vs scheduled, hour by hour
Keyscheduling:readPeopleschedules.readFeaturescheduling - GET
/staffing-rulesList staffing rules
Keyscheduling:readPeopleschedules.readFeaturescheduling - POST
/staffing-rulesCreate a staffing rule
Keyscheduling:writePeoplestaffing_rules.manageFeaturescheduling - GET
/staffing-rules/{id}Get a staffing rule
Keyscheduling:readPeopleschedules.readFeaturescheduling - PATCH
/staffing-rules/{id}Update a staffing rule (partial)
Keyscheduling:writePeoplestaffing_rules.manageFeaturescheduling - DELETE
/staffing-rules/{id}Archive a staffing rule
Keyscheduling:writePeoplestaffing_rules.manageFeaturescheduling
Cash Management
Open reference →- POST
/cash/bank-transactionsSend bank transactions for deposit verification
Keycash:writePeoplenot allowedFeaturecash - GET
/cash/business-daysDaily cash summary for a location
Keycash:readPeoplecash.readFeaturecash - POST
/cash/business-days/{locationId}/{date}:closeClose a business day
Keycash:writePeoplecash.manageFeaturecash - GET
/cash/countsList counts
Keycash:readPeoplecash.readFeaturecash - POST
/cash/countsRecord a drawer, skim or safe count
Keycash:writePeoplecash.countFeaturecash - GET
/cash/depositsList deposits
Keycash:readPeoplecash.readFeaturecash - POST
/cash/depositsRecord a bank deposit
Keycash:writePeoplecash.depositsFeaturecash - POST
/cash/settlementsSend card processor and platform payouts
Keycash:writePeoplenot allowedFeaturecash - POST
/cash/tendersSend tender totals per drawer or shift from the POS
Keycash:writePeoplenot allowedFeaturecash
Inventory
Open reference →- POST
/inventory/adjustmentsAdjust stock
Keyinventory:writePeopleinventory.adjustFeatureinventory - POST
/inventory/wasteRecord waste or shrink
Keyinventory:writePeoplewaste.recordFeatureinventory.waste - GET
/itemsList items
Keyinventory:readPeopleinventory.readFeatureinventory - POST
/itemsCreate an item
Keyinventory:writePeopleitems.manageFeatureinventory - GET
/items/external/{externalId}Get an item by external ID
Keyinventory:readPeopleinventory.readFeatureinventory - PUT
/items/external/{externalId}Create or replace an item by external ID
Keyinventory:writePeopleitems.manageFeatureinventory - GET
/items/{id}Get an item
Keyinventory:readPeopleinventory.readFeatureinventory - PATCH
/items/{id}Update an item (partial)
Keyinventory:writePeopleitems.manageFeatureinventory - GET
/stock-countsList stock counts
Keyinventory:readPeopleinventory.readFeatureinventory - POST
/stock-countsEnter a stock count
Keyinventory:writePeoplestock_counts.countFeatureinventory - GET
/stock-counts/{id}Get a stock count with variances
Keyinventory:readPeopleinventory.readFeatureinventory - POST
/stock-counts/{id}:cancelCancel an open count
Keyinventory:writePeoplestock_counts.manageFeatureinventory - POST
/stock-counts/{id}:postPost a count to the stock ledger
Keyinventory:writePeoplestock_counts.manageFeatureinventory - GET
/stock-levelsStock on hand, reserved and available
Keyinventory:readPeopleinventory.readFeatureinventory - POST
/stock-levels:configureSet par level and reorder point for an item at a location
Keyinventory:writePeopleitems.manageFeatureinventory - GET
/stock-movementsThe stock ledger
Keyinventory:readPeopleinventory.readFeatureinventory - GET
/transfersList transfers
Keyinventory:readPeopleinventory.readFeatureinventory.transfers - POST
/transfersSend stock to another location
Keyinventory:writePeopletransfers.manageFeatureinventory.transfers - GET
/transfers/{id}Get a transfer
Keyinventory:readPeopleinventory.readFeatureinventory.transfers - POST
/transfers/{id}:receiveConfirm what arrived
Keyinventory:writePeopletransfers.manageFeatureinventory.transfers - GET
/usage-recipes/{itemId}What one unit of a sold item uses
Keyinventory:readPeopleinventory.readFeatureinventory.usage_recipes - PUT
/usage-recipes/{itemId}Replace a usage recipe
Keyinventory:writePeopleusage_recipes.manageFeatureinventory.usage_recipes
Purchasing & Ordering
Open reference →- GET
/purchase-ordersList purchase orders
Keypurchasing:readPeoplepurchasing.readFeaturepurchasing - POST
/purchase-ordersCreate a purchase order
Keypurchasing:writePeopleorders.createFeaturepurchasing - GET
/purchase-orders/{id}Get a purchase order
Keypurchasing:readPeoplepurchasing.readFeaturepurchasing - POST
/purchase-orders/{id}:approveApprove a purchase order
Keypurchasing:writePeoplepurchase_orders.approveFeaturepurchasing - POST
/purchase-orders/{id}:cancelCancel a purchase order
Keypurchasing:writePeopleorders.createFeaturepurchasing - POST
/purchase-orders/{id}:receiveReceive a delivery
Keypurchasing:writePeoplegoods_receipts.createFeaturepurchasing - POST
/purchase-orders/{id}:sendMark a purchase order as sent to the supplier
Keypurchasing:writePeopleorders.createFeaturepurchasing - GET
/suggested-ordersSuggested order for a supplier and location
Keypurchasing:readPeopleorders.createFeaturepurchasing.suggested_orders - GET
/supplier-invoicesList supplier invoices
Keypurchasing:readPeoplepurchasing.readFeaturepurchasing - POST
/supplier-invoicesRecord a supplier invoice and match it
Keypurchasing:writePeopleinvoices.matchFeaturepurchasing - POST
/supplier-invoices/{id}:approveApprove a supplier invoice (accept any differences)
Keypurchasing:writePeopleinvoices.matchFeaturepurchasing.invoice_matching - POST
/supplier-invoices/{id}:disputeDispute a supplier invoice
Keypurchasing:writePeopleinvoices.matchFeaturepurchasing.invoice_matching - GET
/suppliersList suppliers
Keypurchasing:readPeoplepurchasing.readFeaturepurchasing - POST
/suppliersCreate a supplier
Keypurchasing:writePeoplesuppliers.manageFeaturepurchasing - GET
/suppliers/external/{externalId}Get a supplier by external ID
Keypurchasing:readPeoplepurchasing.readFeaturepurchasing - PUT
/suppliers/external/{externalId}Create or replace a supplier by external ID
Keypurchasing:writePeoplesuppliers.manageFeaturepurchasing - GET
/suppliers/{id}Get a supplier
Keypurchasing:readPeoplepurchasing.readFeaturepurchasing - PATCH
/suppliers/{id}Update a supplier (partial)
Keypurchasing:writePeoplesuppliers.manageFeaturepurchasing - DELETE
/suppliers/{id}Archive a supplier
Keypurchasing:writePeoplesuppliers.manageFeaturepurchasing - GET
/suppliers/{id}/catalogA supplier's catalog (order guide)
Keypurchasing:readPeoplepurchasing.readFeaturepurchasing - PUT
/suppliers/{id}/catalogReplace a supplier's catalog
Keypurchasing:writePeoplesuppliers.manageFeaturepurchasing
Sales
Open reference →- GET
/customersList customers
Keysales:readPeoplesales.readFeaturesales.orders - POST
/customersCreate a customer
Keysales:writePeoplecustomers.manageFeaturesales.orders - GET
/customers/external/{externalId}Get a customer by external ID
Keysales:readPeoplesales.readFeaturesales.orders - PUT
/customers/external/{externalId}Create or replace a customer by external ID
Keysales:writePeoplecustomers.manageFeaturesales.orders - GET
/customers/{id}Get a customer
Keysales:readPeoplesales.readFeaturesales.orders - PATCH
/customers/{id}Update a customer (partial)
Keysales:writePeoplecustomers.manageFeaturesales.orders - DELETE
/customers/{id}Archive a customer
Keysales:writePeoplecustomers.manageFeaturesales.orders - GET
/invoicesList invoices
Keysales:readPeoplesales.readFeaturesales.invoicing - GET
/invoices/{id}Get an invoice
Keysales:readPeoplesales.readFeaturesales.invoicing - GET
/invoices/{id}/pdfDownload an invoice as PDF
Keysales:readPeoplesales.readFeaturesales.invoicing - POST
/invoices/{id}:payRecord payment of an invoice
Keysales:writePeopleinvoices.issueFeaturesales.invoicing - POST
/invoices/{id}:voidVoid an invoice
Keysales:writePeopleinvoices.issueFeaturesales.invoicing - GET
/sales-ordersList sales orders
Keysales:readPeoplesales.readFeaturesales.orders - POST
/sales-ordersCreate a sales order (reserves stock)
Keysales:writePeoplesales_orders.manageFeaturesales.orders - PUT
/sales-orders/external/{externalId}Create or update an order from another system (e.g. an online store)
Keysales:writePeoplesales_orders.manageFeaturesales.orders - GET
/sales-orders/{id}Get a sales order
Keysales:readPeoplesales.readFeaturesales.orders - POST
/sales-orders/{id}:cancelCancel an order (releases reserved stock)
Keysales:writePeoplesales_orders.manageFeaturesales.orders - POST
/sales-orders/{id}:invoiceIssue an invoice for an order
Keysales:writePeopleinvoices.issueFeaturesales.invoicing - POST
/sales-orders/{id}:shipShip an order (deducts stock)
Keysales:writePeoplesales_orders.manageFeaturesales.orders - GET
/sales-summariesList sales summaries
Keysales:readPeoplesales.readFeaturesales.feeds - POST
/sales-summariesSend hourly or daily sales totals
Keysales:writePeoplenot allowedFeaturesales.feeds - GET
/sales/transactionsList sales transactions
Keysales:readPeoplesales.readFeaturesales.feeds - POST
/sales/transactions:batchSend sales transactions from a POS or online store
Keysales:writePeoplenot allowedFeaturesales.feeds - GET
/sales/unmapped-itemsItems in sales feeds that aren't linked to a PurrOS item
Keysales:readPeoplesales.readFeaturesales.feeds - POST
/sales/unmapped-items:mapLink an unmapped item reference to a PurrOS item
Keysales:writePeoplesales.unmapped.resolveFeaturesales.feeds
Forms, Checklists & Compliance
Open reference →- GET
/auditsList scored audits
Keyoperations:readPeopleaudits.readFeatureoperations.audits - GET
/corrective-actionsList corrective actions
Keyoperations:readPeoplecorrective_actions.manageFeatureoperations.corrective_actions - POST
/corrective-actionsCreate a corrective action
Keyoperations:writePeoplecorrective_actions.manageFeatureoperations.corrective_actions - GET
/corrective-actions/{id}Get a corrective action
Keyoperations:readPeoplecorrective_actions.manageFeatureoperations.corrective_actions - PATCH
/corrective-actions/{id}Update a corrective action (partial)
Keyoperations:writePeoplecorrective_actions.manageFeatureoperations.corrective_actions - POST
/corrective-actions/{id}:closeClose a corrective action with its resolution
Keyoperations:writePeoplecorrective_actions.manageFeatureoperations.corrective_actions - GET
/form-submissionsList submissions
Keyoperations:readPeoplechecklists.manageFeatureoperations - POST
/form-submissionsSubmit a completed form or checklist
Keyoperations:writePeoplechecklists.completeFeatureoperations - GET
/form-submissions/{id}Get a submission with per-question results
Keyoperations:readPeoplechecklists.manageFeatureoperations - GET
/formsList forms
Keyoperations:readPeoplechecklists.completeFeatureoperations - POST
/formsCreate a form
Keyoperations:writePeopleforms.manageFeatureoperations - GET
/forms/external/{externalId}Get a form by external ID
Keyoperations:readPeoplechecklists.completeFeatureoperations - PUT
/forms/external/{externalId}Create or replace a form by external ID
Keyoperations:writePeopleforms.manageFeatureoperations - GET
/forms/{id}Get a form
Keyoperations:readPeoplechecklists.completeFeatureoperations - PATCH
/forms/{id}Update a form (partial)
Keyoperations:writePeopleforms.manageFeatureoperations - DELETE
/forms/{id}Archive a form
Keyoperations:writePeopleforms.manageFeatureoperations - POST
/sensor-readingsSend sensor readings
Keyoperations:writePeoplenot allowedFeatureoperations.sensors - GET
/sensorsList sensors
Keyoperations:readPeoplesensors.manageFeatureoperations.sensors - POST
/sensorsCreate a sensor
Keyoperations:writePeoplesensors.manageFeatureoperations.sensors - GET
/sensors/external/{externalId}Get a sensor by external ID
Keyoperations:readPeoplesensors.manageFeatureoperations.sensors - PUT
/sensors/external/{externalId}Create or replace a sensor by external ID
Keyoperations:writePeoplesensors.manageFeatureoperations.sensors - GET
/sensors/{id}Get a sensor
Keyoperations:readPeoplesensors.manageFeatureoperations.sensors - PATCH
/sensors/{id}Update a sensor (partial)
Keyoperations:writePeoplesensors.manageFeatureoperations.sensors - DELETE
/sensors/{id}Archive a sensor
Keyoperations:writePeoplesensors.manageFeatureoperations.sensors - GET
/sensors/{id}/readingsRecent readings for a sensor (newest first, up to 1,000)
Keyoperations:readPeoplesensors.manageFeatureoperations.sensors
Equipment & Assets
Open reference →- GET
/assetsList assets
Keyequipment:readPeopleequipment.readFeatureequipment - POST
/assetsCreate an asset
Keyequipment:writePeopleequipment.manageFeatureequipment - GET
/assets/external/{externalId}Get an asset by external ID
Keyequipment:readPeopleequipment.readFeatureequipment - PUT
/assets/external/{externalId}Create or replace an asset by external ID
Keyequipment:writePeopleequipment.manageFeatureequipment - GET
/assets/{id}Get an asset
Keyequipment:readPeopleequipment.readFeatureequipment - PATCH
/assets/{id}Update an asset (partial)
Keyequipment:writePeopleequipment.manageFeatureequipment - DELETE
/assets/{id}Archive an asset
Keyequipment:writePeopleequipment.manageFeatureequipment - POST
/assets/{id}/meter-readingsRecord a meter reading (hours, km…)
Keyequipment:writePeopleequipment.manageFeatureequipment - POST
/assets/{id}:maintainedRecord that maintenance was done
Keyequipment:writePeopleequipment.manageFeatureequipment.maintenance - GET
/maintenance/dueAssets due for maintenance by date or meter
Keyequipment:readPeopleequipment.readFeatureequipment.maintenance - GET
/work-ordersList work orders
Keyequipment:readPeopleequipment.readFeatureequipment.work_orders - POST
/work-ordersCreate a work order
Keyequipment:writePeoplework_orders.createFeatureequipment.work_orders - GET
/work-orders/external/{externalId}Get a work order by external ID
Keyequipment:readPeopleequipment.readFeatureequipment.work_orders - PUT
/work-orders/external/{externalId}Create or replace a work order by external ID
Keyequipment:writePeoplework_orders.manageFeatureequipment.work_orders - GET
/work-orders/{id}Get a work order
Keyequipment:readPeopleequipment.readFeatureequipment.work_orders - PATCH
/work-orders/{id}Update a work order (partial)
Keyequipment:writePeoplework_orders.manageFeatureequipment.work_orders
Communication
Open reference →- GET
/announcementsList announcements
Keycommunication:readPeopleanyoneFeaturecommunication.announcements - POST
/announcementsCreate an announcement
Keycommunication:writePeopleannouncements.sendFeaturecommunication.announcements - GET
/announcements/{id}Get an announcement
Keycommunication:readPeopleanyoneFeaturecommunication.announcements - PATCH
/announcements/{id}Update an announcement (partial)
Keycommunication:writePeopleannouncements.sendFeaturecommunication.announcements - DELETE
/announcements/{id}Archive an announcement
Keycommunication:writePeopleannouncements.sendFeaturecommunication.announcements - GET
/announcements/{id}/acknowledgmentsWho has acknowledged an announcement
Keycommunication:readPeopleannouncements.sendFeaturecommunication.announcements - POST
/announcements/{id}:acknowledgeRecord that an employee read an announcement
Keycommunication:writePeopleannouncements.sendFeaturecommunication.announcements - GET
/calendar-eventsList calendar events
Keycommunication:readPeopleanyoneFeaturecommunication.calendar - POST
/calendar-eventsCreate a calendar event
Keycommunication:writePeoplecalendar.manageFeaturecommunication.calendar - GET
/calendar-events/external/{externalId}Get a calendar event by external ID
Keycommunication:readPeopleanyoneFeaturecommunication.calendar - PUT
/calendar-events/external/{externalId}Create or replace a calendar event by external ID
Keycommunication:writePeoplecalendar.manageFeaturecommunication.calendar - GET
/calendar-events/{id}Get a calendar event
Keycommunication:readPeopleanyoneFeaturecommunication.calendar - PATCH
/calendar-events/{id}Update a calendar event (partial)
Keycommunication:writePeoplecalendar.manageFeaturecommunication.calendar - DELETE
/calendar-events/{id}Archive a calendar event
Keycommunication:writePeoplecalendar.manageFeaturecommunication.calendar
Team Displays
Open reference →- GET
/display-metricsLive display metrics
Keyreports:readPeopleanyoneFeaturedisplays - POST
/display-metricsPush live numbers to team displays
Keyreports:writePeoplenot allowedFeaturedisplays - GET
/recognitionsRecent shout-outs (newest first)
Keycommunication:readPeopleanyoneFeaturedisplays.gamification - POST
/recognitionsPost a shout-out
Keycommunication:writePeoplerecognition.giveFeaturedisplays.gamification
Reports & Insights
Open reference →- GET
/alert-rulesList alert rules
Keyreports:readPeoplereports.readFeatureinsights - POST
/alert-rulesCreate an alert rule
Keyreports:writePeoplealerts.manageFeatureinsights - GET
/alert-rules/{id}Get an alert rule
Keyreports:readPeoplereports.readFeatureinsights - PATCH
/alert-rules/{id}Update an alert rule (partial)
Keyreports:writePeoplealerts.manageFeatureinsights - DELETE
/alert-rules/{id}Archive an alert rule
Keyreports:writePeoplealerts.manageFeatureinsights - GET
/kpisHeadline KPIs for a date range
Keyreports:readPeoplereports.readFeatureinsights - GET
/recommendationsRecommended actions
Keyreports:readPeoplerecommendations.readFeatureinsights.recommendations - GET
/reportsList the available reports
Keyreports:readPeoplereports.readFeatureinsights - GET
/reports/{key}Run a report
Keyreports:readPeoplereports.readFeatureinsights
Employee Area
Open reference →- GET
/me/activityChanges made to your record: who, what and when
Keynot allowedPeopleselfFeatureemployee_area - GET
/me/announcementsAnnouncements for you, newest first
Keynot allowedPeopleselfFeatureemployee_area - POST
/me/announcements/{id}:acknowledgeAcknowledge an announcement
Keynot allowedPeopleselfFeatureemployee_area - GET
/me/availabilityYour availability
Keynot allowedPeopleselfFeatureemployee_area - POST
/me/availabilityAdd an availability window
Keynot allowedPeopleselfFeatureemployee_area - DELETE
/me/availability/{id}Remove an availability window
Keynot allowedPeopleselfFeatureemployee_area - GET
/me/documentsDocuments shared with you
Keynot allowedPeopleselfFeatureemployee_area - GET
/me/exportDownload everything PurrOS stores about you (ZIP of JSON and CSV)
Keynot allowedPeopleselfFeatureemployee_area - GET
/me/open-shiftsPublished open shifts you can pick up
Keynot allowedPeopleselfFeatureemployee_area - GET
/me/payYour pay rate history and estimated gross pay per pay period
Keynot allowedPeopleselfFeatureemployee_area - GET
/me/payslipsYour payslips
Keynot allowedPeopleselfFeatureemployee_area - GET
/me/profileYour profile
Keynot allowedPeopleselfFeatureemployee_area - PATCH
/me/profileUpdate your contact details and emergency contacts
Keynot allowedPeopleselfFeatureemployee_area - GET
/me/punch-correctionsYour punch correction requests
Keynot allowedPeopleselfFeatureemployee_area - POST
/me/punch-correctionsAsk your manager to fix a missed or wrong punch
Keynot allowedPeopleselfFeatureemployee_area - POST
/me/punch-corrections/{id}:cancelCancel a pending correction request
Keynot allowedPeopleselfFeatureemployee_area - GET
/me/punchesYour punches (from/to are RFC 3339 times)
Keynot allowedPeopleselfFeatureemployee_area - GET
/me/shift-swapsSwap requests you made or were offered
Keynot allowedPeopleselfFeatureemployee_area - POST
/me/shift-swapsOffer one of your shifts to a co-worker
Keynot allowedPeopleselfFeatureemployee_area - GET
/me/shiftsYour published shifts (from/to are RFC 3339 times)
Keynot allowedPeopleselfFeatureemployee_area - POST
/me/shifts/{id}:claimPick up an open shift at your location
Keynot allowedPeopleselfFeatureemployee_area - GET
/me/time-off/balancesYour time-off balances
Keynot allowedPeopleselfFeatureemployee_area - GET
/me/time-off/requestsYour time-off requests
Keynot allowedPeopleselfFeatureemployee_area - POST
/me/time-off/requestsRequest time off
Keynot allowedPeopleselfFeatureemployee_area - POST
/me/time-off/requests/{id}:cancelCancel one of your time-off requests
Keynot allowedPeopleselfFeatureemployee_area - GET
/me/timesheetsYour timesheets
Keynot allowedPeopleselfFeatureemployee_area
Webhooks
Open reference →- GET
/webhook-endpointsList endpoints;
integrationId(ornonefor standalone) andstatusfilterKeynot allowedPeoplewebhooks.manage(Everyone) - POST
/webhook-endpointsAdd a standalone endpoint; returns its signing secret once
Keynot allowedPeoplewebhooks.manage(Everyone) - GET
/webhook-endpoints/{id}Get an endpoint
Keynot allowedPeoplewebhooks.manage(Everyone) - PATCH
/webhook-endpoints/{id}Change its URL, events or description, or disable and re-enable it
Keynot allowedPeoplewebhooks.manage(Everyone) - DELETE
/webhook-endpoints/{id}Delete a standalone endpoint and its delivery log
Keynot allowedPeoplewebhooks.manage(Everyone) - POST
/webhook-endpoints/{id}:rotate-secretNew signing secret, returned once
Keynot allowedPeoplewebhooks.manage(Everyone) - POST
/webhook-endpoints/{id}:pingSend a
webhook.pingtest eventKeynot allowedPeoplewebhooks.manage(Everyone) - POST
/webhook-endpoints/{id}:retry-failedQueue every failed delivery again
Keynot allowedPeoplewebhooks.manage(Everyone) - GET
/webhook-endpoints/{id}/deliveriesIts deliveries;
status,eventTypeandfromfilterKeynot allowedPeoplewebhooks.manage(Everyone) - GET
/webhook-deliveries/{id}A delivery with the event body exactly as sent
Keynot allowedPeoplewebhooks.manage(Everyone) - POST
/webhook-deliveries/{id}:retrySend a delivery again
Keynot allowedPeoplewebhooks.manage(Everyone)