Coding agent documentation index Fetch the complete documentation index at: https://docs.worklittle.com/docs-agent-manifest.json Use this file to discover all available pages before exploring further.
Attendance
Organization calendar and time-off entries via /attendance. Same data as the Work calendar UI.
Overview
/business/attendance reads and writes your organization's calendar, including time off and interviews. It is the same data as the Work calendar UI.
curl -s -X POST "https://api.worklittle.com/business/attendance" \
-H "Authorization: Bearer $WORKLITTLE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"employee_id":"EMP_ID","start_date":"2026-08-01","end_date":"2026-08-02","type":"pto"}'
GET /business/attendance?start=2026-08-01&end=2026-08-31 lists the organization calendar. start and end (YYYY-MM-DD) are required, and omitting either is a 400. Add employee_id=EMP_ID to list one person's entries.
Authentication
All calls take a Bearer key or a session with the jobs:applications scope. A 403 means the key is valid but the member's organization role cannot access attendance. Field names are snake_case. A 400 response lists the fields required for that entry type.
type is one of in_person, remote, sick, pto, available, unavailable, or interview. type and start_date are required on create. employee_id defaults to the employee linked to the calling account. Times are minutes after midnight (start_time_minutes, end_time_minutes) or HH:MM, with an IANA timezone.
Approve or deny
curl -s -X POST "https://api.worklittle.com/business/attendance/ENTRY_ID/approve" \
-H "Authorization: Bearer $WORKLITTLE_API_KEY"
curl -s -X POST "https://api.worklittle.com/business/attendance/ENTRY_ID/deny" \
-H "Authorization: Bearer $WORKLITTLE_API_KEY"
Titles and repeating entries
title is an optional event name of up to 120 characters. Omit it or send "" to show the type label. On PATCH, an omitted title keeps the current one.
A repeating entry is one stored row with a recurrence_rule, for example FREQ=WEEKLY;BYDAY=MO. end_date is when the series ends. List responses return stored rows. One occurrence has the id SERIES_ID~YYYY-MM-DD. To edit or delete a repeating entry, send recurrence_scope:
| `recurrence_scope` | Effect | | --- | --- | | `this` | Only that occurrence | | `following` | That occurrence and every later one (the series is split) | | `all` | The whole series |
DELETE takes it as ?scope=following. Create, update, and delete responses include changes.entries (every stored row created or changed) and changes.deleted_ids, so you do not need to list the calendar again.
curl -s -X PATCH "https://api.worklittle.com/attendance/SERIES_ID~2026-10-19" \
-H "Authorization: Bearer $WORKLITTLE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"type":"remote","title":"Client visit","recurrence_scope":"following"}'
People and interview invites
Send invitees on create, or replace the list with PUT /business/attendance/:id/invitees. Each item is { "kind": "employee" | "candidate", "id": "..." }, or { "kind": "email", "id": "name@example.com" } for anyone without a record.
curl -s -X POST "https://api.worklittle.com/business/attendance" \
-H "Authorization: Bearer $WORKLITTLE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"employee_id":"EMP_ID","type":"in_person","start_date":"2026-10-20","start_time_minutes":600,"end_time_minutes":645,"timezone":"America/Los_Angeles","title":"Phone screen","invitees":[{"kind":"candidate","id":"CAND_ID"},{"kind":"employee","id":"EMP_2"}]}'
Invite emails:
Each person newly added by a request gets an email with Accept and Decline links (no account needed) and an .ics file. Send "notify_invitees": false on create or "notify": false on PUT to hold them. Send held invites with POST /business/attendance/:id/invitees/notify. Add {"update": true} to also tell guests already invited that the time or type changed. Updating an entry never emails guests by itself. Use the notify route. * Deleting an entry or removing a person sends a cancellation.
Rules:
sick and pto entries cannot have people. Switching an entry to one of them cancels invited guests. An entry holds at most 50 people. GET /business/attendance/:id/invitees returns each person's response (pending, accepted, maybe, or declined), email_sent_at, and email_error. In list responses, an entry someone else added an employee to appears on that employee's calendar as a read-only row with id ENTRY_ID@EMPLOYEE_ID, invited_from_entry_id, and invite_response. Declined entries are left out.
Routes
| Method | Path | Description |
| --- | --- | --- |
| GET | `/business/attendance?start=&end=` | Organization calendar entries. Add `employee_id=` for one person. |
| POST | `/business/attendance` | Create |
| PATCH | `/attendance/:id` | Update |
| DELETE | `/attendance/:id` | Delete |
| POST | `/business/attendance/:id/approve` | Approve a pending edit |
| POST | `/business/attendance/:id/deny` | Deny a pending edit |
| GET | `/business/attendance/:id/invitees` | People on an entry, with RSVP status |
| PUT | `/business/attendance/:id/invitees` | Replace the people on an entry (emails anyone new) |
| POST | `/business/attendance/:id/invitees/notify` | Email guests not invited yet (and, with `update`, the rest) |
| PATCH | `/business/attendance/invitees/:id` | Set the job (`posted_job_id`) a guest's event is for |
| GET | `/business/attendance/people?q=` | Search employees and candidates to add |
| GET | `/business/attendance/interviews?candidate_id=` or `?employee_id=` | Events a person is a guest on, with job and RSVP |
| GET | `/business/attendance/external-busy?start=&end=` | Your busy times from connected and imported calendars (no titles) |
| POST | `/business/attendance/calendar-imports` | Import a calendar into your own: `{ "url": "webcal://…" }` or `{ "name": "x.ics", "content": "…", "timezone": "America/Los_Angeles" }` (iCalendar, vCalendar, or CSV) |
| DELETE | `/business/attendance/calendar-imports/:id` | Remove an imported calendar |
| POST | `/business/attendance/calendar-accounts` | Link another Google or Outlook account: `{ "source": "google" \| "outlook", "callback_url": "…" }` returns `redirect_url` |
| DELETE | `/business/attendance/calendar-accounts/:id` | Disconnect a linked Google or Outlook account |
| POST | `/business/attendance/calendar-feed` | Private subscribe links for a calendar (`{ "employee_id"?, "reset"? }`) |
| POST | `/business/attendance/booking-links` | New public booking link for your own calendar, or one you can edit with `{ "employee_id" }`. Returns `{ id, url, expires_at }`. The link is `calendar.worklittle.com/<id>/30min` and expires after 30 days. |
| POST | `/business/attendance/booking-requests/:id/accept` | Accept a visitor's request (adds it to your calendar and emails them) |
| POST | `/business/attendance/booking-requests/:id/decline` | Decline a request |
| POST | `/business/attendance/booking-requests/:id/propose` | Suggest `{ start_date, start_time_minutes }` instead |
SDK
import { createWorklittle } from "worklittle";
const wl = createWorklittle({ apiKey: process.env.WORKLITTLE_API_KEY });
const all = await wl.attendance.list();
const one = await wl.attendance.list({ employee_id: "EMP_ID", start: "2026-08-01", end: "2026-08-31" });
await wl.attendance.create({ /* entry fields */ });
Install and setup: SDK.