Pages

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.

71 endpointsUpdated October 27, 20269 min read
On this page
  1. You
  2. Organizations
  3. Single sign-on
  4. Templates
  5. Template directory
  6. Checklists
  7. Steps
  8. Proof
  9. Assignments
  10. Recurring checklists
  11. Activity
  12. People and squads
  13. Notifications
  14. Integrations

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/me

Who 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_VIEW

The 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_SETTINGS

Rename 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_SETTINGS

Sign 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_SETTINGS

Where 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_SETTINGS

Choose the identity provider: { "provider": "okta" } (microsoft-entra, okta, google-workspace or generic-saml).

POST/api/organizations/{id}/sso/domainsORGANIZATION_MANAGE_SETTINGS

Add a domain to verify: { "domain": "acmeproperty.com" }. The answer names the TXT record to publish.

POST/api/organizations/{id}/sso/domains/{domainId}/checkORGANIZATION_MANAGE_SETTINGS

Look for the domain's TXT record now.

DELETE/api/organizations/{id}/sso/domains/{domainId}ORGANIZATION_MANAGE_SETTINGS

Remove a domain.

POST/api/organizations/{id}/sso/metadata/validateORGANIZATION_MANAGE_SETTINGS

Check the identity provider's SAML metadata without saving it: { "metadataXml": "…" } or { "metadataUrl": "https://…" }.

POST/api/organizations/{id}/sso/metadataORGANIZATION_MANAGE_SETTINGS

Save 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_SETTINGS

Start a test sign-in through the provider; the answer carries the address to open.

POST/api/organizations/{id}/sso/test/resultORGANIZATION_MANAGE_SETTINGS

Record how the test sign-in ended.

POST/api/organizations/{id}/sso/activateORGANIZATION_MANAGE_SETTINGS

Turn single sign-on on, once a domain is verified and a test has passed.

POST/api/organizations/{id}/sso/disableORGANIZATION_MANAGE_SETTINGS

Turn single sign-on off; people sign in with email codes again.

Templates

GET/api/templatesTEMPLATE_VIEW

The 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_TEMPLATE

Add 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_EDIT

Replace 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/templates

A 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/categories

The 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_VIEW

The 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_CHECKLIST

Start 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_FINISH

Finish 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_VIEW

Sections: id, checklistId, key, title, position. Filter: checklistId.

POST/api/sectionsCHECKLIST_EDIT

Add a section to a running checklist: id, checklistId, key, title, position.

PUT/api/sections/{id}SECTION_EDIT

Rename or move a section: { "title": "…", "position": 2 }. A field left out stays as it is.

DELETE/api/sections/{id}SECTION_EDIT

Remove a section. Its steps move to the checklist itself. 404 when it is already gone.

Steps

GET/api/itemsITEM_VIEW

Steps: 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_EDIT

Add 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_COMPLETE

Tick, 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_EDIT

Remove 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_VIEW

The 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_COMPLETE

Record 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_COMPLETE

Where to PUT the bytes: a url that works for a short while, and the headers the PUT must carry.

POST/api/proofs/{id}/uploadedITEM_COMPLETE

Say the bytes are in. The row becomes uploaded.

DELETE/api/proofs/{id}ITEM_COMPLETE

Remove a photo or signature from a step that is still open.

Assignments

GET/api/assignmentsCHECKLIST_VIEW

Who 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_ASSIGN

Give 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_ASSIGN

Clear 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_VIEW

The 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_SCHEDULE

Set 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_MANAGE

Its 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_VIEW

The schedules' sections: scheduleId, key, title, position.

GET/api/schedule-itemsSCHEDULE_ITEM_VIEW

The schedules' steps: scheduleId, sectionId, key, title, instructions, fields, position.

GET/api/schedule-assignmentsSCHEDULE_VIEW

Who 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_ASSIGN

Assign 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_ASSIGN

Clear a part's own assignee, so it follows the part above. 404 when it has none.

GET/api/schedule-skipsSCHEDULE_VIEW

The days taken out of each schedule: scheduleId, date.

POST/api/schedule-skipsSCHEDULE_MANAGE

Take 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_MANAGE

Put a day back. 404 when it is not skipped.

GET/api/admin/schedulerACCESS_SYSADMIN_DASHBOARD

System 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_VIEW

What 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_VIEW

The organization's members (kind: "person", with displayName, email, isAdmin) and its integrations by name (kind: "integration"). Only people can be assigned.

GET/api/squadsORGANIZATION_VIEW

The organization's squads: id, subjectId (what you assign to), name, description.

POST/api/squadsORGANIZATION_MANAGE_SQUADS

Form a squad. Admins only; no key may.

GET/api/squad-membersORGANIZATION_VIEW

Who is in each squad: squadId, principalId.

POST/api/squad-membersORGANIZATION_MANAGE_SQUADS

Put a member in a squad. Admins only.

DELETE/api/squad-members/{id}ORGANIZATION_MANAGE_SQUADS

Take a member out of a squad. Admins only.

GET/api/invitationsORGANIZATION_MANAGE_MEMBERS

Pending invitations. Empty for a key.

POST/api/invitationsORGANIZATION_MANAGE_MEMBERS

Invite someone by email. Admins only; no key may.

DELETE/api/invitations/{id}ORGANIZATION_MANAGE_MEMBERS

Revoke 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-settings

The caller's own email settings, as a one-row page: emailAssigned, emailBlocked, emailFinished, emailDueSoon.

PUT/api/me/notification-settings

Replace 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_INTEGRATIONS

The organization's keys: name, role, keyHint, createdAt, lastUsedAt, expiresAt, revokedAt, rollingUntil. Never a key itself.

POST/api/integrationsORGANIZATION_MANAGE_INTEGRATIONS

Make 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_INTEGRATIONS

Rename a key or change its role: { "name": "…", "role": "read" }.

POST/api/integrations/{id}/rollORGANIZATION_MANAGE_INTEGRATIONS

A new key, shown once; the old one keeps working for overlapHours (24 by default, 168 at most).

DELETE/api/integrations/{id}ORGANIZATION_MANAGE_INTEGRATIONS

Revoke a key. It stops at once.

Did this page answer your question?

Tell us what was missingEdit this page on GitHub