Stitchflow
Toast logo

Toast User Management API Guide

API workflow

How to automate user lifecycle operations through APIs with caveats that matter in production.

UpdatedMar 16, 2026

Summary and recommendation

Toast exposes employee provisioning through its Labor API at https://ws-api.toasttab.com, authenticated via OAuth 2.0 client credentials (POST /authentication/v1/authentication/login).

Tokens expire after 1 hour;

integrations must handle re-authentication proactively on 401 responses.

API access requires enrollment in the Toast Partner Program - credentials are not fully self-serve for all customers.

The API is strictly restaurant-location-scoped.

Every request requires the Toast-Restaurant-External-ID header set to the target restaurant's GUID;

there is no org-level or multi-location employee endpoint.

Multi-location operators must iterate over each restaurant GUID independently for every provisioning or deprovisioning operation.

Core employee operations are covered: GET /labor/v1/employees (list, paginated via pageToken, max 100 per page), GET /labor/v1/employees/{guid} (single record), POST /labor/v1/employees (create), and PATCH /labor/v1/employees/{guid} (update or soft-delete).

The labor:read and labor:write OAuth scopes are required for read and write operations respectively.

API quick reference

Has user APIYes
Auth methodOAuth 2.0 (client credentials grant)
Base URLOfficial docs
SCIM availableNo
SCIM plan requiredEnterprise

Authentication

Auth method: OAuth 2.0 (client credentials grant)

Setup steps

  1. Register as a Toast API partner or integration developer via the Toast Partner Portal.
  2. Obtain a client_id and client_secret from the Toast developer dashboard.
  3. POST to https://ws-api.toasttab.com/authentication/v1/authentication/login with client_id and client_secret to receive a Bearer token.
  4. Include the Bearer token in the Authorization header for all subsequent API requests.
  5. Tokens expire; re-authenticate using the same client credentials flow when a 401 is returned.

Required scopes

Scope Description Required for
labor:read Read access to employee records, jobs, and shifts. GET /labor/v1/employees, GET /labor/v1/employees/{guid}
labor:write Write access to create or update employee records. POST /labor/v1/employees, PATCH /labor/v1/employees/{guid}

User object / data model

Field Type Description On create On update Notes
guid string (UUID) Unique Toast identifier for the employee. system-assigned immutable Used as path parameter for individual employee operations.
externalId string External identifier for the employee set by the integrating system. optional updatable Useful for mapping to HR/payroll system IDs.
firstName string Employee's first name. required updatable
lastName string Employee's last name. required updatable
email string Employee's email address. optional updatable Used for Toast account login if employee has a Toast account.
phoneNumber string Employee's phone number. optional updatable
passcode string POS passcode for the employee. optional updatable Used for POS login; not returned in GET responses for security.
jobReferences array of objects List of job assignments for the employee, each with a job GUID and wage. optional updatable References Toast Job objects; jobs must exist before assignment.
restaurantUserGuid string (UUID) GUID of the restaurant location this employee belongs to. required immutable Passed as the Toast-Restaurant-External-ID header, not in the body.
deleted boolean Indicates whether the employee record has been soft-deleted. system-assigned (false) read-only Deleted employees are returned when includeDeleted=true query param is used.
createdDate string (ISO 8601) Timestamp when the employee record was created. system-assigned immutable
modifiedDate string (ISO 8601) Timestamp when the employee record was last modified. system-assigned system-assigned

Core endpoints

List employees

  • Method: GET
  • URL: https://ws-api.toasttab.com/labor/v1/employees
  • Watch out for: The Toast-Restaurant-External-ID header is mandatory; omitting it returns a 400 error.

Request example

GET /labor/v1/employees?pageToken=&pageSize=100
Authorization: Bearer {token}
Toast-Restaurant-External-ID: {restaurantGuid}

Response example

{
  "employees": [
    {"guid":"abc-123","firstName":"Jane","lastName":"Doe","email":"jane@example.com"}
  ],
  "pageToken": "next-page-token"
}

Get employee by GUID

  • Method: GET
  • URL: https://ws-api.toasttab.com/labor/v1/employees/{employeeGuid}
  • Watch out for: Returns 404 if the employee GUID does not belong to the restaurant specified in the header.

Request example

GET /labor/v1/employees/abc-123
Authorization: Bearer {token}
Toast-Restaurant-External-ID: {restaurantGuid}

Response example

{
  "guid": "abc-123",
  "firstName": "Jane",
  "lastName": "Doe",
  "email": "jane@example.com",
  "deleted": false
}

Create employee

  • Method: POST
  • URL: https://ws-api.toasttab.com/labor/v1/employees
  • Watch out for: Creating an employee does not automatically grant POS access; job assignments and passcode must be set separately.

Request example

POST /labor/v1/employees
Authorization: Bearer {token}
Toast-Restaurant-External-ID: {restaurantGuid}

{"firstName":"John","lastName":"Smith","email":"john@example.com"}

Response example

{
  "guid": "def-456",
  "firstName": "John",
  "lastName": "Smith",
  "email": "john@example.com",
  "deleted": false
}

Update employee

  • Method: PATCH
  • URL: https://ws-api.toasttab.com/labor/v1/employees/{employeeGuid}
  • Watch out for: Only fields included in the PATCH body are updated; omitted fields retain their current values.

Request example

PATCH /labor/v1/employees/def-456
Authorization: Bearer {token}
Toast-Restaurant-External-ID: {restaurantGuid}

{"email":"john.new@example.com"}

Response example

{
  "guid": "def-456",
  "firstName": "John",
  "lastName": "Smith",
  "email": "john.new@example.com"
}

Authenticate (get token)

  • Method: POST
  • URL: https://ws-api.toasttab.com/authentication/v1/authentication/login
  • Watch out for: userAccessType must be TOAST_MACHINE_CLIENT for server-to-server integrations. Token expiry is 1 hour.

Request example

POST /authentication/v1/authentication/login
Content-Type: application/json

{"clientId":"your-client-id","clientSecret":"your-client-secret","userAccessType":"TOAST_MACHINE_CLIENT"}

Response example

{
  "token": {
    "tokenType": "Bearer",
    "token": "eyJ...",
    "expiresIn": 3600
  }
}

List jobs

  • Method: GET
  • URL: https://ws-api.toasttab.com/labor/v1/jobs
  • Watch out for: Job GUIDs are required when assigning jobReferences to an employee; jobs are restaurant-scoped.

Request example

GET /labor/v1/jobs
Authorization: Bearer {token}
Toast-Restaurant-External-ID: {restaurantGuid}

Response example

{
  "jobs": [
    {"guid":"job-111","title":"Server","deleted":false}
  ]
}

Rate limits, pagination, and events

  • Rate limits: Toast does not publicly document specific numeric rate limits in its developer docs. Rate limiting is enforced but thresholds are not published.

  • Rate-limit headers: Unknown

  • Retry-After header: Unknown

  • Rate-limit notes: No explicit rate limit values, headers, or Retry-After behavior documented in official Toast developer docs as of research date.

  • Pagination method: token

  • Default page size: 100

  • Max page size: 100

  • Pagination pointer: pageToken

  • Webhooks available: No

  • Webhook notes: Toast does not publicly document a webhook system for employee/user-management events in its developer docs. Event-driven notifications for employee changes are not described in official documentation.

  • Alternative event strategy: Poll GET /labor/v1/employees with a modifiedDate filter or pageToken-based pagination to detect changes.

SCIM API status

  • SCIM available: No
  • SCIM version: Not documented
  • Plan required: Enterprise
  • Endpoint: Not documented

Limitations:

  • Toast does not offer a native SCIM 2.0 endpoint according to official documentation.
  • No IdP (Okta, Entra, Google Workspace, OneLogin) SCIM connector is officially documented by Toast.
  • Employee provisioning must be performed via the Toast Labor API directly.

Common scenarios

For provisioning a new hire across multiple locations, authenticate once, retrieve your restaurant GUID list, then POST /labor/v1/employees per location with firstName, lastName, email, and jobReferences.

Store the returned employee GUID per location - there is no shared identity across locations, so your identity graph must maintain a per-location GUID map for each employee.

For deprovisioning, PATCH /labor/v1/employees/{employeeGuid} with {"deleted": true for each location the employee belongs to.

Toast uses soft deletes only;

records persist and are retrievable with includeDeleted=true.

There is no hard-delete endpoint, and the deleted field is the sole mechanism for access revocation via API.

For HR roster sync, paginate GET /labor/v1/employees?pageSize=100 per location using pageToken until exhausted, then diff against your HR system using externalId as the correlation key.

There is no delta or changelog endpoint - full pagination is required on every sync cycle.

Use modifiedDate on the employee object to minimize unnecessary PATCH calls.

Provision a new employee across multiple restaurant locations

  1. Authenticate via POST /authentication/v1/authentication/login to obtain a Bearer token.
  2. Retrieve the list of restaurant GUIDs for the organization (via the Toast Configuration API or stored mapping).
  3. For each restaurant GUID, POST /labor/v1/employees with the employee's firstName, lastName, email, and desired jobReferences.
  4. Store the returned employee GUID per restaurant for future updates or deprovisioning.

Watch out for: Employee records are not shared across restaurant locations; a separate POST is required per location. There is no org-wide employee create endpoint.

Deprovision (soft-delete) a departing employee

  1. Authenticate to obtain a Bearer token.
  2. For each restaurant location the employee belongs to, PATCH /labor/v1/employees/{employeeGuid} with {"deleted": true} and the appropriate Toast-Restaurant-External-ID header.
  3. Verify the employee no longer appears in GET /labor/v1/employees (without includeDeleted=true).

Watch out for: Toast uses soft deletes; the employee record persists and is retrievable with includeDeleted=true. There is no hard-delete endpoint documented.

Sync employee roster from an external HR system

  1. Authenticate and retrieve all employees via GET /labor/v1/employees?pageSize=100 for each restaurant location, paginating with pageToken until exhausted.
  2. Compare the retrieved roster against the HR system's employee list using externalId as the correlation key.
  3. For new HR employees not in Toast, POST /labor/v1/employees to create them.
  4. For changed employees (name, email, job), PATCH /labor/v1/employees/{guid} with updated fields.
  5. For terminated employees present in Toast but not in HR, PATCH with {"deleted": true}.

Watch out for: There is no delta/changelog endpoint; full pagination is required on each sync cycle. Store modifiedDate to minimize unnecessary updates.

Why building this yourself is a trap

The location-scoped API model is the primary architectural trap: building an integration without accounting for per-location GUID iteration will silently miss employees at locations not explicitly enumerated. This is especially dangerous for offboarding - a departing employee soft-deleted at one location retains active records at all others unless each is patched individually.

Webhooks are not documented for employee events. All change detection must be polling-based, which means your sync frequency directly determines how stale your identity graph can become between cycles. Pair this with undocumented rate limits (implement exponential backoff on 429s;

no Retry-After header is documented) and full roster pagination at scale requires careful throttle management.

Two additional caveats worth flagging explicitly: the passcode field is write-only and never returned in GET responses, so your system cannot audit or verify POS passcode state after creation.

And creating an employee record via POST does not automatically grant POS terminal access - job assignments and passcode must be set in the same or a subsequent request, or the employee cannot clock in.

Automate Toast workflows without one-off scripts

Stitchflow builds and maintains end-to-end IT automation across your SaaS stack, including apps without APIs. Built for exactly how your company works, with human approvals where they matter.

Every app coverage, including apps without APIs
60+ app integrations plus browser automation for apps without APIs
IT graph reconciliation across apps and your IdP
Less than a week to launch, maintained as APIs and admin consoles change
SOC 2 Type II. ~2 hours of your team's time

UpdatedMar 16, 2026

* Details sourced from official product documentation and admin references.

Keep exploring

Related apps

Abnormal Security logo

Abnormal Security

API Only
AutomationAPI only
Last updatedMar 2026

Abnormal Security is an enterprise email security platform focused on detecting and investigating threats such as phishing, account takeover (ATO), and vendor email compromise. It does not support SCIM provisioning, which means every app in your stack

ActiveCampaign logo

ActiveCampaign

API Only
AutomationAPI only
Last updatedFeb 2026

ActiveCampaign uses a group-based permission model: every user belongs to exactly one group, and all feature-area access (Contacts, Campaigns, Automations, Deals, Reports, Templates) is configured at the group level, not per individual. The default Adm

ADP logo

ADP

API Only
AutomationAPI only
Last updatedFeb 2026

ADP Workforce Now is a mid-market to enterprise HCM platform that serves as the HR source of record for employee data — payroll, benefits, time, and talent. User access is governed by a hybrid permission model: predefined security roles (Security Maste