REST API
Endpoint reference
Every route of the ChecklistSquad REST API: what it takes, what it returns, and the permission it checks on which part of your organization.
On this page
Every route is under https://api.checklistsquad.com and needs Authorization: Bearer <key>. The label at the right of each route is the permission it checks; Keys and roles says which role carries which. Lists answer { "data": [...], "nextCursor": ... } and take cursor and pageSize (pages).
You
GET/api/meWho the key acts as: principalId, organizationId, kind (integration for a key, person for someone signed in) and systemAdmin. Make this call when you set up a connection.
curl https://api.checklistsquad.com/api/me -H "Authorization: Bearer $CSQ_KEY"
Organizations
GET/api/organizationsORGANIZATION_VIEWThe organization the key belongs to, with what the caller may manage there: canManageMembers, canManageSquads, canCreateTemplates, canManageSettings, canManageIntegrations, and the setting membersCanAddTemplates.
PUT/api/organizations/{id}ORGANIZATION_MANAGE_SETTINGSRename the organization or turn "Members can add templates" on or off: { "name": "Acme Property", "membersCanAddTemplates": false }. Admins only; no key may.
POST/api/organizations/{id}/sessions/revokeORGANIZATION_MANAGE_SETTINGSSign everyone in the organization out of every device. Admins only; no key may. API keys are not sessions: revoke a key on its own.
Single sign-on
The routes behind the app's SSO & security screen. Admins only; no key may call them. Single sign-on explains the setup.
GET/api/organizations/{id}/ssoORGANIZATION_MANAGE_SETTINGSWhere single sign-on stands: the connection and its provider, the domains and the TXT record each needs, the values to give the identity provider, the policy, and what may happen next.
PUT/api/organizations/{id}/sso/providerORGANIZATION_MANAGE_SETTINGSChoose the identity provider: { "provider": "okta" } (microsoft-entra, okta, google-workspace or generic-saml).
POST/api/organizations/{id}/sso/domainsORGANIZATION_MANAGE_SETTINGSAdd a domain to verify: { "domain": "acmeproperty.com" }. The answer names the TXT record to publish.
POST/api/organizations/{id}/sso/domains/{domainId}/checkORGANIZATION_MANAGE_SETTINGSLook for the domain's TXT record now.
DELETE/api/organizations/{id}/sso/domains/{domainId}ORGANIZATION_MANAGE_SETTINGSRemove a domain.
POST/api/organizations/{id}/sso/metadata/validateORGANIZATION_MANAGE_SETTINGSCheck the identity provider's SAML metadata without saving it: { "metadataXml": "…" } or { "metadataUrl": "https://…" }.
POST/api/organizations/{id}/sso/metadataORGANIZATION_MANAGE_SETTINGSSave the identity provider's metadata, as above.
PUT/api/organizations/{id}/sso/policyORGANIZATION_MANAGE_SETTINGS{ "requireSsoForExistingMembers": true, "allowJitProvisioning": true }: whether members must sign in through the provider, and whether new people at a verified domain join on first sign-in.
POST/api/organizations/{id}/sso/testORGANIZATION_MANAGE_SETTINGSStart a test sign-in through the provider; the answer carries the address to open.
POST/api/organizations/{id}/sso/test/resultORGANIZATION_MANAGE_SETTINGSRecord how the test sign-in ended.
POST/api/organizations/{id}/sso/activateORGANIZATION_MANAGE_SETTINGSTurn single sign-on on, once a domain is verified and a test has passed.
POST/api/organizations/{id}/sso/disableORGANIZATION_MANAGE_SETTINGSTurn single sign-on off; people sign in with email codes again.
Templates
GET/api/templatesTEMPLATE_VIEWThe organization's library and the public templates. Each has id, title, summary, category, isPublic, key (a public template's name, such as guest-room-turnover-checklist), version and its definition: sections, their steps, and each step's fields. Filters: organizationId, library=true (the library only), public=true. To browse the public templates, search them or read them by category, use the directory.
curl "https://api.checklistsquad.com/api/templates?public=true" -H "Authorization: Bearer $CSQ_KEY"
POST/api/templatesORGANIZATION_CREATE_TEMPLATEAdd a template to the library, one of three ways: a copy (sourceTemplateId), a checklist's shape (sourceChecklistId), or a definition of your own. Always send id (a UUID) and title. Answers 201 with the template; 409 when the id exists. Full keys may.
curl https://api.checklistsquad.com/api/templates -H "Authorization: Bearer $CSQ_KEY" -H "Content-Type: application/json" \
-d '{ "id": "a1f2…", "title": "Room turnover, ours", "sourceTemplateId": "3b0e…" }'
PUT/api/templates/{id}TEMPLATE_EDITReplace a library template's title, summary, category and definition. The version goes up by one. Public templates cannot be edited. Running checklists keep the shape they started with.
Template directory
The public templates, for anyone: these routes need no key, so a website or a script can list and read them before anyone signs up. Answers are cached for five minutes. Start a checklist from one with POST /api/checklists and its id.
GET/api/catalog/templatesA page of public templates, A to Z by title: id, key, title, summary, category, categoryName, kind, sections, steps, image and updatedAt. Filters: category (A to Z within it) and q, which matches templates holding every word of it in their title, summary or steps. 24 to a page unless pageSize says otherwise; there is no total.
curl "https://api.checklistsquad.com/api/catalog/templates?category=hospitality&q=minibar"
GET/api/catalog/templates/{key}One public template whole by its key: its definition, version, category and its page's words (listing). 404 for any other key.
GET/api/catalog/categoriesThe categories, A to Z by name, or with featured=true the ones the directory features, in their order: key, name, shortName, description, icon, image, featured.
GET/api/catalog/categories/{key}One category by its key; 404 when there is none.
Checklists
GET/api/checklistsCHECKLIST_VIEWThe checklists in the organization: id, title, status (inProgress, completed), templateId, templateVersion, creatorPrincipalId, createdAt, dueAt, completedAt, and whether the caller may assign (canAssign) or edit (canEdit) each. Filter: id.
curl "https://api.checklistsquad.com/api/checklists?id=5f0d3c1a-…" -H "Authorization: Bearer $CSQ_KEY"
POST/api/checklistsORGANIZATION_CREATE_CHECKLISTStart a checklist. From a template, send templateId and title, and optionally id and dueAt; the server makes the sections and steps. From nothing, send id, title and the rows: sections (id, key, title, position) and items (id, key, title, sectionId, position, fields). Answers 201; 409 when the id exists. The key and the admin who made it own the checklist. Start and Full keys may.
curl https://api.checklistsquad.com/api/checklists -H "Authorization: Bearer $CSQ_KEY" -H "Content-Type: application/json" \
-d '{ "templateId": "3b0e…", "title": "Room 12, Friday" }'
PUT/api/checklists/{id}CHECKLIST_FINISHFinish it, { "status": "completed" }, or rename it, { "title": "…" } (which needs CHECKLIST_EDIT). Finishing works at any point; open and blocked steps stay as they are.
GET/api/sectionsSECTION_VIEWSections: id, checklistId, key, title, position. Filter: checklistId.
POST/api/sectionsCHECKLIST_EDITAdd a section to a running checklist: id, checklistId, key, title, position.
PUT/api/sections/{id}SECTION_EDITRename or move a section: { "title": "…", "position": 2 }. A field left out stays as it is.
DELETE/api/sections/{id}SECTION_EDITRemove a section. Its steps move to the checklist itself. 404 when it is already gone.
Steps
GET/api/itemsITEM_VIEWSteps: id, checklistId, sectionId, key, title, instructions, position, fields (key, type, label, required, unit), status (open, done, blocked, skipped), statusReason, answers by field key, doneAt, doneByPrincipalId. Filter: checklistId.
curl "https://api.checklistsquad.com/api/items?checklistId=5f0d3c1a-…" -H "Authorization: Bearer $CSQ_KEY"
POST/api/itemsSECTION_EDITAdd a step: id, checklistId, sectionId (or null for the checklist itself, which needs CHECKLIST_EDIT), key, title, instructions, fields, position.
PUT/api/items/{id}ITEM_COMPLETETick, answer, block or skip a step: { "status": "done", "answers": { "meter-reading": "4821" } }. blocked and skipped need statusReason; done needs every required field. Changing its title, instructions, fields, sectionId or position needs ITEM_EDIT.
curl -X PUT https://api.checklistsquad.com/api/items/9a2c… -H "Authorization: Bearer $CSQ_KEY" -H "Content-Type: application/json" \
-d '{ "status": "blocked", "statusReason": "No clean towels in the store room" }'
DELETE/api/items/{id}ITEM_EDITRemove a step that is still open. A done, blocked or skipped step is evidence and stays.
Proof
Photos and signatures on a step's photo or signature fields. Recording one is a row first, then its bytes go to storage through a short-lived upload address. Photo proof explains how it works in the app.
GET/api/proofsCHECKLIST_VIEWThe proof on the checklists the key may see: id, checklistId, itemId, fieldKey, kind (photo, signature), contentType, status (pending until uploaded), who added it, when it was captured, and for an uploaded one a url good for a day.
POST/api/proofsITEM_COMPLETERecord a photo or a signature on a step: id (a UUID), checklistId, itemId, fieldKey, kind, contentType, byteLength, width, height, capturedAt. Answers 201 with the row; 409 when the id exists.
POST/api/proofs/{id}/uploadITEM_COMPLETEWhere to PUT the bytes: a url that works for a short while, and the headers the PUT must carry.
POST/api/proofs/{id}/uploadedITEM_COMPLETESay the bytes are in. The row becomes uploaded.
DELETE/api/proofs/{id}ITEM_COMPLETERemove a photo or signature from a step that is still open.
Assignments
GET/api/assignmentsCHECKLIST_VIEWWho holds each part: one row per assigned checklist, section or step, with nodeType, nodeId, principalId (a person, a squad, or everyone in the organization), displayName, and pending while an invited person has not joined. Filter: checklistId.
POST/api/assignmentsCHECKLIST_ASSIGNGive a checklist, section or step to someone: id (the node, checklist::{id}, section::{id} or item::{id}), checklistId, nodeType, nodeId, and principalId from /api/people or /api/squads. Sections need SECTION_ASSIGN, steps ITEM_ASSIGN. Sending it again with someone else replaces the assignee.
DELETE/api/assignments/{id}CHECKLIST_ASSIGNClear a part's assignee, so it falls back to whoever holds the part above it. The id is the node, as above.
Recurring checklists
A recurring checklist is a schedule: its shape, its rhythm and who does each part every time. ChecklistSquad makes each day's checklist ahead; those days are ordinary checklists above, with scheduleId, occurrenceDate and availableAt. No key role carries the schedule permissions yet, so these routes answer a key with an empty page or 403; they are the app's.
GET/api/schedulesSCHEDULE_VIEWThe organization's recurring checklists: title, rule (frequency, interval, days, dayOfMonth), readyTime, dueTime, timeZoneId, startsOn, endsOn, status (active, paused), pausedReason, pausedNode, generatedThrough, lastError, and whether the caller may manage each (canManage).
POST/api/schedulesORGANIZATION_CREATE_SCHEDULESet one up: id, title, templateId, the rows (sections, items), rule, readyTime, dueTime, timeZoneId, startsOn, endsOn, and assignments (one line per part: nodeType, nodeId, principalId or invitationId). Answers 201 with the schedule, its plan granted and its first day made; 409 when the id exists.
PUT/api/schedules/{id}SCHEDULE_MANAGEIts whole editable state: title, rule, readyTime, dueTime, timeZoneId, startsOn, endsOn and status. A moved rhythm makes the next day again; paused takes a day not yet open back, active resumes from today.
GET/api/schedule-sectionsSCHEDULE_SECTION_VIEWThe schedules' sections: scheduleId, key, title, position.
GET/api/schedule-itemsSCHEDULE_ITEM_VIEWThe schedules' steps: scheduleId, sectionId, key, title, instructions, fields, position.
GET/api/schedule-assignmentsSCHEDULE_VIEWWho does each part every time, one row per schedule node with its own assignee or pending invitee: scheduleId, nodeType, nodeId, principalId, invitationId, displayName, pending.
POST/api/schedule-assignmentsSCHEDULE_ASSIGNAssign a part from the next day on: scheduleId, nodeType, nodeId, and principalId or invitationId. A section needs SCHEDULE_SECTION_ASSIGN, a step SCHEDULE_ITEM_ASSIGN. The day already made and not yet open changes with it.
DELETE/api/schedule-assignments/{id}SCHEDULE_ASSIGNClear a part's own assignee, so it follows the part above. 404 when it has none.
GET/api/schedule-skipsSCHEDULE_VIEWThe days taken out of each schedule: scheduleId, date.
POST/api/schedule-skipsSCHEDULE_MANAGETake a day out: id, scheduleId, date. A day already open, or one the rhythm doesn't fall on, is refused with 400.
DELETE/api/schedule-skips/{id}SCHEDULE_MANAGEPut a day back. 404 when it is not skipped.
GET/api/admin/schedulerACCESS_SYSADMIN_DASHBOARDSystem administrators only: the scheduler's last run, how many schedules are active and paused, and the latest day it could not make.
Activity
GET/api/activityCHECKLIST_VIEWWhat happened, oldest first: kind (checklist.started, item.done, item.blocked, assigned, checklist.finished, …), the part it happened to, actorPrincipalId and actorName (a person or an integration), at, and via when a person acted through an AI assistant. Filter: checklistId.
curl "https://api.checklistsquad.com/api/activity?checklistId=5f0d3c1a-…" -H "Authorization: Bearer $CSQ_KEY"
People and squads
GET/api/peopleORGANIZATION_VIEWThe organization's members (kind: "person", with displayName, email, isAdmin) and its integrations by name (kind: "integration"). Only people can be assigned.
GET/api/squadsORGANIZATION_VIEWThe organization's squads: id, subjectId (what you assign to), name, description.
POST/api/squadsORGANIZATION_MANAGE_SQUADSForm a squad. Admins only; no key may.
GET/api/squad-membersORGANIZATION_VIEWWho is in each squad: squadId, principalId.
POST/api/squad-membersORGANIZATION_MANAGE_SQUADSPut a member in a squad. Admins only.
DELETE/api/squad-members/{id}ORGANIZATION_MANAGE_SQUADSTake a member out of a squad. Admins only.
GET/api/invitationsORGANIZATION_MANAGE_MEMBERSPending invitations. Empty for a key.
POST/api/invitationsORGANIZATION_MANAGE_MEMBERSInvite someone by email. Admins only; no key may.
DELETE/api/invitations/{id}ORGANIZATION_MANAGE_MEMBERSRevoke a pending invitation. Admins only.
Notifications
Email settings belong to a person. A key gets an empty list and cannot change them: an integration gets no email.
GET/api/notification-settingsThe caller's own email settings, as a one-row page: emailAssigned, emailBlocked, emailFinished, emailDueSoon.
PUT/api/me/notification-settingsReplace the caller's email settings with the four switches above.
Integrations
These are the routes the app's Integrations page uses. They need an admin signed in; no key may call them.
GET/api/integrationsORGANIZATION_MANAGE_INTEGRATIONSThe organization's keys: name, role, keyHint, createdAt, lastUsedAt, expiresAt, revokedAt, rollingUntil. Never a key itself.
POST/api/integrationsORGANIZATION_MANAGE_INTEGRATIONSMake a key: id (twelve letters and digits), name, role (read, start or full), expiresAt. Answers 201 with the integration and the key, once.
PUT/api/integrations/{id}ORGANIZATION_MANAGE_INTEGRATIONSRename a key or change its role: { "name": "…", "role": "read" }.
POST/api/integrations/{id}/rollORGANIZATION_MANAGE_INTEGRATIONSA new key, shown once; the old one keeps working for overlapHours (24 by default, 168 at most).
DELETE/api/integrations/{id}ORGANIZATION_MANAGE_INTEGRATIONSRevoke a key. It stops at once.