Using the Staff API
Purpose of this guide
This guide covers how to create, retrieve, update, and delete the staff (employees) under a business account using ReceiptRoller's Staff API. It is the entry point for working with staff data — for shift management apps, per-POS-operator sales apps, HR system integrations, and more.
Prerequisites
- You have obtained an access token via the OAuth 2.0 authorization code flow
- Your app's scopes include
store.staff.read(read) /store.staff.write(create, update, delete) - You know the business account ID (UUID) (Listing business accounts, stores, and POS terminals)
- Base URL:
https://receiptroller.io
Endpoints
| Method | Path | Purpose | Required scope |
|---|---|---|---|
| GET | /api/v1/staff | List / search staff | store.staff.read |
| GET | /api/v1/staff/{staffId} | Detail of one person | store.staff.read |
| POST | /api/v1/staff | Create | store.staff.write |
| PUT | /api/v1/staff/{staffId} | Update | store.staff.write |
| DELETE | /api/v1/staff/{staffId} | Delete (soft delete) | store.staff.write |
1. Retrieve the staff list
GET /api/v1/staff?organizationId={organizationId}
Authorization: Bearer {access_token}
Query parameters (all optional, AND-combined)
storeId— only staff assigned to that store (staff assigned to all stores are also included)position— filter by role/title (exact match)employmentType— FullTime / PartTime / Contract / Otherstatus— Active / Inactive / Pendingsearch— partial search by name (including kana), employee number, or reference IDincludeDeleted— whether to include deleted records (default false)
Response example
{
"organizationId": "a04507de-043a-4b47-b0a3-6204562f6e20",
"staff": [
{
"id": "stf-001",
"organizationId": "a04507de-...",
"employeeNumber": "E-0001",
"referenceId": "TM_xyz",
"userId": "",
"name": {
"first": "Taro",
"last": "Tanaka",
"firstKana": "タロウ",
"lastKana": "タナカ",
"display": "Taro Tanaka"
},
"role": {
"position": "Store manager",
"employmentType": "FullTime",
"isOwner": false
},
"status": "Active",
"contact": { "phone": "090-1234-5678", "email": "tanaka@example.com" },
"hr": { "hireDate": "2024-04-01T00:00:00Z", "dateOfBirth": "1990-05-15T00:00:00Z", "address": "Shibuya-ku, Tokyo..." },
"pay": {
"hourlyRate": 1800,
"isOvertimeExempt": true,
"tipEligible": true,
"jobs": [
{
"jobTitle": "Store manager",
"payType": "HOURLY",
"hourlyRate": 1800,
"annualRate": 0,
"weeklyHours": 40,
"locationIds": ["store-A"]
},
{
"jobTitle": "Cashier",
"payType": "HOURLY",
"hourlyRate": 1200,
"annualRate": 0,
"weeklyHours": 10,
"locationIds": ["store-B"]
}
]
},
"assignments": {
"storeIds": ["store-A", "store-B"],
"allLocations": false
},
"emergency": { "name": "Hanako Tanaka", "phone": "090-...", "relation": "Spouse" },
"integrations": { "squareTeamMemberId": "TM_xyz", "smaregiStaffId": "" },
"profileImageUrl": "https://...",
"notes": "",
"createdAt": "2024-04-01T09:00:00Z",
"updatedAt": "2026-06-02T10:30:00Z"
}
],
"totalCount": 1
}
2. Retrieve the detail of one person
GET /api/v1/staff/{staffId}?organizationId={organizationId}
Authorization: Bearer {access_token}
Returns 404 if the staff member does not belong to the specified business account.
3. Create
POST /api/v1/staff?organizationId={organizationId}
Authorization: Bearer {access_token}
Content-Type: application/json
{
"displayName": "Hanako Sato",
"firstName": "Hanako",
"lastName": "Sato",
"firstNameKana": "ハナコ",
"lastNameKana": "サトウ",
"employeeNumber": "E-0002",
"position": "Cashier",
"employmentType": "PartTime",
"status": "Active",
"phone": "080-9876-5432",
"email": "sato@example.com",
"hourlyRate": 1200,
"hireDate": "2026-06-01",
"isOvertimeExempt": false,
"tipEligible": true,
"assignedStoreIds": "store-001,store-002",
"isAssignedToAllLocations": false,
"jobAssignmentsJson": "[{\"jobTitle\":\"Cashier\",\"payType\":\"HOURLY\",\"hourlyRate\":1200,\"weeklyHours\":20,\"locationIds\":[\"store-001\"]}]"
}
Points
- Either
displayName, orfirstName+lastName, is required - Even if you include
organizationIdin the request body, it is ignored. The business account resolved from the token/query is always used - If there are multiple jobs, pass an array in
jobAssignmentsJson. For a single job, justposition+hourlyRateis fine
4. Update
PUT /api/v1/staff/{staffId}?organizationId={organizationId}
Authorization: Bearer {access_token}
Content-Type: application/json
{
"displayName": "Hanako Sato",
"phone": "080-9876-5432",
"hourlyRate": 1300,
"status": "Active"
}
Overwrites with the fields you send (a full replacement, not a partial update). For fields whose values you want to keep, resend the existing values along with the change.
5. Delete (soft delete)
DELETE /api/v1/staff/{staffId}?organizationId={organizationId}
Authorization: Bearer {access_token}
Points
- The response is
204 No Content - Because it is a soft delete, resolving the staff ID from past shift logs or POS transactions still works
- Deleted staff are not included in list or search results
Correspondence with Square Team Member
This API's fields are compatible with the Square Team Members API. On a business account where the Square integration is enabled, integrations.squareTeamMemberId is set automatically, and changes on Square are also reflected into ReceiptRoller (planned for implementation in Phase 3, t-e9a2f482).
Fields originating from Square
referenceId⇔ Squarereference_idrole.isOwner⇔ Squareis_ownerstatus⇔ Squarestatus(ACTIVE → "Active" / INACTIVE → "Inactive")assignments.allLocations⇔ Squareassignment_type: ALLpay.jobs⇔ Squarewage_setting.job_assignmentspay.isOvertimeExempt⇔ Squareis_overtime_exemptpay.tipEligible⇔ Squaretip_eligible
Fields unique to ReceiptRoller (not present in / not synced from Square)
- Name kana (firstNameKana, lastNameKana)
- Hire date, date of birth, address
- Emergency contact (emergency.*)
- Employment type (FullTime / PartTime / Contract / Other)
- Profile photo
- Notes, employee number, Smaregi integration ID
Typical flow (mobile app)
- Obtain an access token via OAuth → scopes include
store.staff.readandstore.staff.write - Select a business account with
GET /api/v1/me/organizations - Show
GET /api/v1/staff?storeId=...paginated on the staff list screen - Add a new staff member with
POST /api/v1/staff - On the edit screen,
GET /api/v1/staff/{id}→PUT /api/v1/staff/{id} - For offboarding,
DELETE /api/v1/staff/{id}(or PUT withstatus: "Inactive")
Error responses
| Status | Meaning | What to do |
|---|---|---|
| 401 Unauthorized | Access token invalid / expired | Re-obtain with the refresh token |
| 403 Forbidden | Missing the required scope / not a member of the business account | Check the scope and the selected business account |
| 400 Bad Request | Missing required field (displayName or firstName/lastName) | Review the request body |
| 404 Not Found | The staff ID does not exist in that business account | Re-fetch from the list |
Related information
-
Using the Store Information APIA guide to the REST API for fetching and updating a store's basic information (store name, store type, contact details, and address). Lets you implement a store information editing screen from token-authenticated clients such as staff apps.
-
PosTransactionDto specification — field reference for transaction dataA complete field reference for PosTransactionDto, the canonical model for the transaction data ReceiptRoller handles. For each category — identifiers, dates, amounts, line items, payments, staff, status, and CRM linkage — it summarizes the field names, types, meanings, and how each POS vendor populates them. A reference for developers and external-system integrators. Also referenced from the Smaregi and Square mapping articles.
-
Purchase and receipt data integrationExplains the structure of the purchase and receipt data ReceiptRoller handles, how to retrieve it, related scopes, Webhooks, and common use cases.
-
Using the Business Hours APIA guide to ReceiptRoller's Business Hours API (/api/v1/stores/{storeId}/business-hours). Covers retrieving and updating per-day business hours, registering special business days (temporary closures and hour changes), configuring a store's workable hours (the upper bound for shift creation), and determining whether the store is currently open.
-
Using the Orders / OMS APIA guide to CRUD operations on the orders under a business account using ReceiptRoller's Orders / OMS API (/api/v1/orders). Covers creating, updating, transitioning status (confirm, process, cancel), and deleting orders, plus the flow for Android / iOS apps and server integrations.