API ReferenceRestaurant
Shift · shift
Portable restaurant labor shift / timecard contract.
Entity type:
shift· Methods: GET
Portable restaurant labor shift / timecard contract.
Endpoints
GET /unified/{accountId}/shift # List normalized shift recordsSchema
| Field | Type | Required | Description |
|---|---|---|---|
externalId | string | Yes | Stable shift or timecard identifier. |
employeeExternalId | string | — | Employee / team-member identifier. |
startAt | string · ISO 8601 | — | Shift start time. |
endAt | string · ISO 8601 | — | Shift end time when closed. |
updatedAt | string · ISO 8601 | — | Last updated timestamp. |
state | enum | — | Normalized labor-shift state. Values: OPEN, COMPLETED. |
Example object
{
"externalId": "shf_88213",
"employeeExternalId": "emp_2214",
"startAt": "2026-07-08T15:00:00Z",
"endAt": "2026-07-08T23:00:00Z",
"updatedAt": "2026-07-08T23:02:14Z",
"state": "COMPLETED"
}The same shape is used as the POST request body and returned by GET reads — reads from
every connected system are normalized to it.
Requests
curl "https://api.linktoany.com/unified/{accountId}/shift?pageSize=10" \
-H "accept: application/json" \
-H "authorization: Bearer ak_<your_api_key>"const page = await client.records.list(accountId, 'shift', {
pageSize: 10,
});
for (const shift of page.data) {
console.log(shift);
}
// Or walk every page — the SDK follows the cursor for you
for await (const shift of client.records.iterate(accountId, 'shift')) {
await save(shift);
}Supported systems
| System | Read | Write | Auth | Rate limit |
|---|---|---|---|---|
| Square | Yes | — | OAuth 2.0 | 5 req / s |
| Lightspeed K-Series | Yes | — | OAuth 2.0 | 100 req / 60s |
| Toast | Yes | — | API token | 5 req / s |