Drive the full check-in lifecycle via Dailybot — list and complete pending check-ins, see pending/completed status for a day, inspect a check-in's questions and schedule, browse response history, edit or reset a submitted response, and backfill or future-date responses. Also authors check-ins — create and configure a check-in (schedule, participants, reminders, privacy, smart/AI) and manage its questions (types, report titles, variations, conditional logic). Works headless with an API key. Use when the developer asks to fill in their standup, answer daily questions, check what check-ins they have, edit or reset a check-in, review past responses, or create/configure a check-in. Do not use for free-text progress reports — those go through dailybot-report.
Install
npx skillscat add dailybothq/deepworkplan-vim/dailybot-checkin Install via the SkillsCat registry.
Dailybot Check-in
You help developers complete their pending check-ins (daily standups, weekly surveys, async rituals) through Dailybot. Check-ins are structured questionnaires set up by a team lead — each has a set of questions that the developer answers. This is distinct from free-text progress reports (handled by dailybot-report).
Auth model — API key or login
Check-in commands accept either a Bearer login session (dailybot login)
or an org API key (DAILYBOT_API_KEY).
A login session is the same one used by the webapp — it scopes actions to the
acting identity's permissions and pending check-ins (the server resolves the
API key's owner).
If the developer has only an API key, check-in commands still work — the CLI
falls back to X-API-KEY. Prefer dailybot login for the human's own personal
pending check-ins. (Both credentials work —dailybot upgrade or dailybot login.)
When to Use
- "complete my check-in", "fill in my standup", "answer my dailybot"
- "what check-ins do I have?", "any pending standups?", "check-in status"
- "what does my standup ask?" / inspect a check-in's questions or schedule (
show) - "show my past check-ins", "check-in history"
- "edit / update my check-in answer", "reset / delete today's check-in" (
edit/reset) - "submit my standup for yesterday / for a specific date" (backfill / future-date)
- At the start of a work session when the developer wants to catch up on rituals
Do not use this skill for free-text progress reports — route those todailybot-report instead. Check-ins are structured questionnaires with
specific questions; reports are freeform updates.
Step 1 — Verify Setup
Read and follow the authentication steps in `../shared/auth.md`. That file covers CLI installation, login, API key setup, and agent profile configuration.
Additionally, confirm at least one credential is present (a login session or an API key):
dailybot status --auth 2>&1If the output shows a logged-in user session or a configured API key,
proceed. Otherwise guide them through dailybot login (see auth.md) or ask
them to set DAILYBOT_API_KEY.
If auth fails or the developer declines, skip and continue with your primary task.
Step 2 — List Pending Check-ins
dailybot checkin list --jsonThis returns today's pending check-ins for the logged-in user.
JSON output shape
{
"count": 1,
"pending_checkins": [
{
"followup_name": "Daily Standup",
"followup_uuid": "<uuid>",
"template_questions": [
{
"uuid": "<question-uuid>",
"question": "What did you complete yesterday?",
"question_type": "text_field",
"is_blocker": false,
"index": 0
}
]
}
]
}Present check-ins to the developer
When check-ins are found, summarize them clearly:
"You have 1 pending check-in via Dailybot:
- Daily Standup — 3 questions
- What did you complete yesterday?
- What are you working on today?
- Any blockers?
Want me to help you fill it in?"
When no check-ins are found:
"No pending check-ins right now. You're all caught up."
Step 3 — Complete a Check-in
Once the developer wants to complete a check-in, you have two approaches:
3a. Gather answers from context (recommended for agents)
Use what you know about the developer's recent work to draft answers, then
confirm before submitting. This is the best experience — the developer
reviews and approves rather than typing everything.
"Based on your recent work, here's what I'd submit for Daily Standup:
- What did you complete yesterday? — "Shipped the auth refactor with full test coverage"
- What are you working on today? — "Starting the payment integration"
- Any blockers? — "None"
Should I submit these answers? (yes / edit / skip)"
3b. Ask the developer for each answer
If you don't have enough context, ask for each answer individually:
"For your Daily Standup:
- What did you complete yesterday?"
Wait for each answer, then confirm before submitting.
Submit via CLI (non-interactive)
dailybot checkin complete <followup_uuid> \
-a 0="Shipped the auth refactor with full test coverage" \
-a 1="Starting the payment integration" \
-a 2=no \
--yesTimeout: Allow at least 30 seconds for CLI commands to complete. Do not use a shorter timeout.
Answer types — match the question, not your prose
Every answer is validated against its question's question_type. Read the types
first (dailybot checkin show <followup_uuid> --json) and answer accordingly;
the server rejects a mismatch with 400 ["response is not valid"] and does not
say which question was wrong.
question_type |
Answer with | Example |
|---|---|---|
text |
Free text | -a 0="Shipped the auth refactor" |
boolean |
yes/no, true/false, or 1/0 |
-a 2=no |
numeric |
A number | -a 1=8 |
multiple_choice |
One of the question's choices labels |
-a 3="Blocked" |
A blocker question is very often boolean, so answering it "None" or "N/A"
— the natural English answer — is rejected. The CLI converts your string to the
right JSON type; it cannot guess that "None" means false.
CLI flags
| Flag | Short | Description |
|---|---|---|
--answer |
-a |
index=response pair (0-based question index). Repeatable. |
--response-date |
Target date YYYY-MM-DD. Defaults to today. Only works while the check-in is still pending; once today's response is submitted you can no longer backfill a past day from the CLI. |
|
--yes |
-y |
Skip confirmation prompt. |
--json |
Emit machine-readable JSON output. |
Exit codes
| Code | Meaning |
|---|---|
0 |
Success |
3 |
Not authenticated — guide through dailybot login |
7 |
User aborted the confirmation prompt |
Step 3.5 — The full check-in lifecycle
Beyond list + complete, the CLI covers the whole check-in lifecycle. Every
command below takes --json and works headless with an API key — this is what
lets an agent do almost everything with check-ins from the terminal.
Status for a day
dailybot checkin status [--date YYYY-MM-DD] [--json]Each check-in with its pending/completed state for that day (default today).
JSON: { "date", "count", "checkins": [{ uuid, name, response_completed, ... }] }.
Inspect a check-in's questions & schedule
dailybot checkin show <followup_uuid> [--json]Name, schedule (frequency / time / timezone), and every question with its type
and UUID. Use this to know what a check-in asks (and each question's uuid)
before completing or editing it.
Browse response history
dailybot checkin history <followup_uuid> --days 7 [--json]
dailybot checkin history <followup_uuid> --from 2026-06-01 --to 2026-06-30 --json
dailybot checkin history <followup_uuid> --user <user_uuid> --days 30 # one participant
dailybot checkin history <followup_uuid> --search "deploy" --days 30 # keyword filter
dailybot checkin history <followup_uuid> --days 30 --page 2 --page-size 20Responses over a date range (date, completed, answer summary). Check-ins are
team-wide, so this lists every participant's responses by default (unlike
forms, which default to your own). Pass --user <uuid> to narrow to one
participant — that filter is admin/manager only; a member always sees only their
own responses regardless of the flag.
--usertakes a UUID, nothing else. An email or a display name is
rejected before the request withinvalid_user_identifier. Resolve it first
withdailybot user list --json.
Paging.
--page/--page-size/--limitreturn a single slice; with
none of them the command walks every page.--search/--grepis a
case-insensitive substring filter (max 256 chars, truncated client-side). See
`../shared/list-query-and-errors.md`.
Edit an existing response
dailybot checkin edit <followup_uuid> -a 0="Updated answer" --yes [--json]
dailybot checkin edit <followup_uuid> [--date YYYY-MM-DD] # prompts each question with the current valueOverrides specific answers on the already-submitted response, then re-submits.
Use dailybot checkin history/show first to learn the question order.
Reset (delete) a response
dailybot checkin reset <followup_uuid> [--date YYYY-MM-DD] [--yes] [--json]Deletes your own response for a day (confirms first unless --yes / --json).
Backfill (past) & future-dating
complete accepts --response-date; edit / reset / history accept--date (or --from/--to). The server may refuse when the check-in disallows
it — the CLI maps the code to a friendly message (and includes it in --json
errors):
code |
Meaning |
|---|---|
previous_responses_are_not_allowed |
Backfill is disabled for this check-in |
future_responses_are_not_allowed |
Future-dating is disabled |
followup_not_allow_responses_before_trigger_time |
Too early (before the trigger time) |
user_is_not_a_followup_member |
You're not a participant |
responses_not_allowed_on_inactive_followup |
The check-in is inactive |
template_questions_version_conflict |
Questions changed — re-run show and retry |
response_date_format_is_invalid |
Use YYYY-MM-DD |
Interactive terminal chat
In dailybot ask (the AI chat), the native slash commands /checkins,/checkin edit, and /checkin reset drive these same flows with numbered
prompts — handy for humans; agents should use the headless commands above.
Step 3.7 — Authoring check-ins (create / configure / questions)
Requires
dailybot-cli >= 3.9.0(the skill-pack baseline). The authoring surface —checkin create,checkin config,checkin archive, thecheckin questions add|edit|delete|reorder
group, resolving people by email, the smart/AI flags, and the create requires
≥ 1 question rule (questions_required) — is all available. Ifdailybot --versionis below 3.9.0, rundailybot upgrade.
Everything above answers a check-in. This section builds one. As of the
authoring release, an agent can create a check-in from scratch, tune every
scheduling / reminder / privacy / AI setting, manage its questions (including
conditional jump logic), verify the result with a round-trip read, and archive
it — all headless with an API key.
Role-gated. Configuring, archiving a check-in, and editing its questions
are admin/manager operations server-side. Creating a check-in is now
allowed for any authenticated member.
Update and delete remain admin/manager only. Answering check-ins (Steps 2–3.5)
is not role-gated.
Create in one shot vs. configure incrementally
There are two authoring styles, and they share the same flag vocabulary:
- One-shot create —
dailybot checkin create -n "Name" [all the flags]
builds a fully-configured check-in in a single call, seeding questions with--questions-file/--interactive/--ai-short-question. - Incremental configure —
dailybot checkin create -n "Name" --user @me --questions-file q.jsonfirst (participant + at least one question are both
mandatory), thendailybot checkin config <followup_uuid> [flags]to change
settings later.configis a partial update: only the flags you pass
change; everything else is left untouched. This is the safest way for an
agent to adjust one setting without disturbing the rest.
Both accept the same scheduling / reminder / submission / privacy / smart-AI /
participant / channel flags below. A few flags are create-only or
config-only — the reference table calls those out.
# Create a check-in (minimal — one participant AND one question are mandatory)
dailybot checkin create -n "Daily Standup" --user me@example.com --questions-file q.json
# Later, flip one setting without touching anything else
dailybot checkin config <followup_uuid> --time 09:30 --reminders 2Timeout: Allow at least 30 seconds for these commands. Do not use a shorter timeout.
Participants are required (read this first)
A check-in must have at least one participant AND at least one question.
- Non-interactive create with no
--userand no--teamfails fast withcheckin_requires_participant. Always pass at least one participant when
scripting a create. - Create with no questions fails fast with
questions_required— seed at
least one question with--questions-fileor--interactive(add/edit/remove
more later viacheckin questions). - In an interactive TTY,
createprompts for participants instead of
erroring. - On
config,--user/--teamREPLACE the entire participant set (full
replace, not append). To add one person you must re-list everyone who should
remain. Same semantics for--report-channel(see channels below).
# Two people + a whole team as participants
dailybot checkin create -n "Daily Standup" \
--user me@example.com --user "Jane Doe" \
--team "My Team"Full flag reference (create / config)
Users resolve by name, email, or UUID. Resolving a --user by email
needs admin/manager permissions; when that lookup isn't allowed the CLI falls
back with a clear message (use a UUID or name instead).
Scheduling
| Flag | Values / format | Notes |
|---|---|---|
--time |
HH:MM |
Delivery time. |
--days |
comma weekdays 0-6 |
0 = Sunday. E.g. 1,2,3,4,5 = Mon–Fri. |
--timezone |
IANA name | E.g. America/New_York. |
--schedule-file |
JSON path | Full schedule object from a file. |
--start-on / --end-on |
YYYY-MM-DD |
Active window bounds. |
--frequency |
weekly only |
Weekly cadence. Monthly/custom go through --frequency-advanced — --frequency monthly fails fast (invalid_frequency_type). |
--every |
integer >= 1 |
Repeat interval (every N periods). |
--frequency-advanced |
disabled / monthly / custom |
Advanced cadence selector. Use custom with --cron. |
--cron |
"m h dom mon dow" |
5-field cron, for custom cadence only. |
--trigger-based / --fixed-time |
flag | Trigger-based vs. fixed-time delivery. |
--participant-timezone / --custom-timezone |
flag | Use each participant's TZ vs. one custom TZ. |
--report-time |
HH:MM |
When the aggregated report is posted. |
Reminders
| Flag | Values | Notes |
|---|---|---|
--reminders |
0-5 |
Number of reminders. 0 = off. |
--reminder-interval |
0-60 |
Minutes between reminders. |
--reminder-condition |
smart_frequency / fixed_frequency |
When reminders fire. |
--reminder-tone |
standard / persuasive |
Reminder voice (invalid_reminder_tone if other). |
Submission rules
| Flag | Notes |
|---|---|
--work-days / --no-work-days |
Restrict to working days. |
--allow-early / --no-early |
Allow submitting before the trigger time. |
--allow-past / --no-past |
Allow backfilling past responses. |
--allow-future / --no-future |
Allow future-dating responses. |
--one-by-one / --aggregated |
Deliver questions one-by-one vs. all at once. |
Privacy / anonymity
| Flag | Values | Notes |
|---|---|---|
--anonymous / --no-anonymous |
flag | Irreversible: once anonymous, --no-anonymous fails with anonymous_irreversible (unlike forms). |
--privacy |
only_owner, owner_and_members, managers_and_members, managers_and_admins, org_admins, everyone, custom |
Who can see responses. |
Smart / AI
| Flag | Values | Dependency |
|---|---|---|
--smart / --no-smart |
flag | Adaptive AI conversation mode. |
--intelligence / --no-intelligence |
flag | AI insights on responses. Requires --smart. |
--max-clarifying |
0-5 |
Cap on AI follow-up questions. Requires --intelligence when > 0. |
The dependency chain is enforced server-side: --intelligence without --smart
and --max-clarifying > 0 without --intelligence both fail withintelligence_requires_smart_checkin.
Intro / outro
| Flag | Notes |
|---|---|
--intro |
Opening message, 3–1024 chars. |
--outro |
Closing message, 3–1024 chars. |
Participants
| Flag | Scope | Notes |
|---|---|---|
--user |
create + config | Name, email, or UUID. Repeatable. On config, REPLACES the user set. |
--team |
create + config | Name or UUID. Repeatable. On config, REPLACES the team set. |
Channels
| Flag | Notes |
|---|---|
--report-channel |
Channel UUID. Repeatable, max 3 (too_many_report_channels, enforced client- and server-side). On config, REPLACES the channel set. |
Questions seeding (create) + config-only flags
| Flag | Scope | Notes |
|---|---|---|
--questions-file |
create | Seed questions from a JSON array (see below). |
--interactive |
create | Prompt for questions interactively. |
--ai-short-question |
create | Let AI generate report titles for seeded questions. |
-n / --name |
create + config | Check-in name. |
--active / --inactive |
config | Activate / deactivate the check-in. |
Question authoring (checkin questions ...)
Questions are managed with a dedicated subgroup. This is the same question
model forms use — the types, report-title rule, variations, and conditional
logic below are shared.
dailybot checkin questions add <followup_uuid> --type TYPE --question TEXT [flags]
dailybot checkin questions edit <followup_uuid> <question_uuid> [same flags]
dailybot checkin questions delete <followup_uuid> <question_uuid>
dailybot checkin questions reorder <followup_uuid> <q_uuid> <q_uuid> ...Question types
The complete catalog is four types — there are no others:
--type |
Options? | Behavior |
|---|---|---|
text |
no | Free-text answer. |
multiple_choice |
yes — --options "A,B,C" |
Choose from a fixed list. |
boolean |
no | Yes/No answer. |
numeric |
no | Numeric answer. |
Common flags on add / edit:
| Flag | Notes |
|---|---|
--required / --optional |
Whether an answer is mandatory. |
--blocker / --no-blocker |
Tag the "blocker" question. |
--short-question |
Report title, <= 512 chars. See the rule below. |
--ai-short-question |
Let AI generate the report title instead. |
--variation |
Alternate phrasing. Repeatable, up to 10, rotated per run. |
--logic-file |
Conditional logic from a JSON file. |
--jump-if-equals / --jump-to / --else-jump-to |
Inline conditional logic (see below). |
Report title is REQUIRED on add
Every added question needs a report title (the short label used in the
posted report). Provide it one of two ways:
--short-question "Title"— an explicit title (<= 512chars), or--ai-short-question— let Dailybot's AI generate one.
Explicit titles are preserved; AI only fills in the blanks. Passing neither
is an error: short_question_required. On edit the report title is not
required (edits are partial updates).
# Add a required text question with an explicit report title + two variations
dailybot checkin questions add <followup_uuid> \
--type text --question "What did you complete yesterday?" \
--short-question "Yesterday" --required \
--variation "What did you get done since your last update?" \
--variation "Recap of yesterday's work?"
# Add a multiple-choice question and let AI name it
dailybot checkin questions add <followup_uuid> \
--type multiple_choice --question "How's the sprint going?" \
--options "On track,At risk,Blocked" --ai-short-questionReordering
questions reorder takes the complete set of question UUIDs in the new
order. Passing a partial/incomplete set is rejected withquestion_uuids_incomplete — always list every question.
dailybot checkin questions reorder <followup_uuid> \
<q_uuid_c> <q_uuid_a> <q_uuid_b>Conditional logic (jump rules)
A question can branch to a later question (or end the check-in) based on the
answer. Attach logic either with a full JSON file (--logic-file) or
inline with --jump-if-equals VALUE --jump-to N [--else-jump-to M].
Logic shape:
{
"rules": {
"rules_if": [
{
"conditions": [
{"operator": "is_equal_to", "comparison_value": "Blocked", "logic_connector": "or"}
],
"then": {"action": "jump_to", "target": 5}
}
],
"rules_else": {"action": "jump_to", "target": -1}
}
}rules_elseis required.- Jump targets are forward-only:
targetmust be greater than this
question's index, or-1(end the check-in). The server owns the index
and auto-clamps dangling targets when a question is deleted or reordered.
Operators by question type:
| Type | Operators |
|---|---|
text |
is_equal_to, is_not_equal_to, contains, not_contains, begins_with, not_begins_with, ends_with, not_ends_with |
numeric |
is_equal_to, is_not_equal_to, lower_than, lower_or_equal_than, greater_than, greater_or_equal_than |
multiple_choice / boolean |
is_equal_to, is_not_equal_to |
Logic connectors:
| Type | Allowed connectors |
|---|---|
text / numeric / boolean |
and, or |
multiple_choice |
or only |
Boolean comparison values are JSON true / false (the CLI coerces--jump-if-equals true / --jump-if-equals false).
Actions:
action |
target |
|---|---|
jump_to |
integer question index (forward-only, or -1 = end) |
trigger_checkin |
a check-in UUID |
trigger_form |
a form UUID |
Inline jump example — if the blocker answer is Yes, skip ahead to question 4:
dailybot checkin questions add <followup_uuid> \
--type boolean --question "Any blockers?" \
--short-question "Blockers" --blocker \
--jump-if-equals true --jump-to 4 --else-jump-to -1--questions-file JSON format
--questions-file (and forms' equivalent) is a JSON array, max 50
questions. Each object supports:
| Key | Alias | Notes |
|---|---|---|
question_type |
type |
One of the four types. |
question |
label |
The question text. |
options |
For multiple_choice. |
|
required |
Boolean. | |
is_blocker |
Boolean. | |
short_question |
Report title. | |
variations |
Array of alternate phrasings. | |
logic |
Logic object (same shape as above). |
[
{
"question_type": "text",
"question": "What did you complete yesterday?",
"short_question": "Yesterday",
"required": true,
"variations": ["Recap of yesterday's work?"]
},
{
"question_type": "text",
"question": "What are you working on today?",
"short_question": "Today",
"required": true
},
{
"question_type": "boolean",
"question": "Any blockers?",
"short_question": "Blockers",
"is_blocker": true,
"logic": {
"rules": {
"rules_if": [
{"conditions": [{"operator": "is_equal_to", "comparison_value": true, "logic_connector": "or"}],
"then": {"action": "jump_to", "target": 3}}
],
"rules_else": {"action": "jump_to", "target": -1}
}
}
}
]Round-trip verification (checkin show)
After authoring, read the full config back with dailybot checkin show <followup_uuid> --json and confirm it matches your intent. The detail JSON:
{
"id": "<uuid>",
"name": "Daily Standup",
"is_active": true,
"is_archived": false,
"schedule": {"days": [1, 2, 3, 4, 5], "time": "09:00", "timezone": "America/New_York"},
"start_on": "2026-07-01",
"end_on": null,
"frequency_type": "weekly",
"frequency": 1,
"frequency_advanced": "disabled",
"frequency_cron": null,
"reminders_max_count": 2,
"reminders_frequency_time": 15,
"reminders_trigger_condition": "smart_frequency",
"reminder_tone": "standard",
"is_anonymous": false,
"privacy": "owner_and_members",
"use_participant_timezone": true,
"allow_past_responses": true,
"allow_future_responses": false,
"is_smart_checkin": false,
"is_intelligence_enabled": false,
"max_clarifying_questions": 0,
"custom_template_intro": "Good morning! Time for standup.",
"custom_template_outro": "Thanks — have a great day!",
"participants": {
"users": [{"uuid": "<uuid>", "name": "Jane Doe"}],
"teams": [{"uuid": "<uuid>", "name": "My Team"}]
},
"report_channels": [
{"id": "<uuid>", "name": "standups", "platform": "slack", "type": "channel"}
],
"questions": [
{
"uuid": "<uuid>",
"index": 0,
"question": "What did you complete yesterday?",
"question_type": "text",
"required": true,
"is_blocker": false,
"short_question": "Yesterday",
"choices": [],
"variations": ["Recap of yesterday's work?"],
"logic": null
}
]
}For multiple_choice, choices is populated as [{"label": "...", "value": "..."}].
Archiving
dailybot checkin archive <followup_uuid> [--yes] soft-deletes a check-in
(confirms first unless --yes).
Authoring error codes
code |
Meaning |
|---|---|
questions_required |
Create had no questions — seed ≥ 1 with --questions-file/--interactive. |
checkin_requires_participant |
Create had no --user/--team — add at least one participant. |
intelligence_requires_smart_checkin |
--intelligence needs --smart; --max-clarifying > 0 needs --intelligence. |
anonymous_irreversible |
Tried --no-anonymous on an already-anonymous check-in — not allowed. |
too_many_report_channels |
More than 3 --report-channel values. |
short_question_required |
add had neither --short-question nor --ai-short-question. |
invalid_frequency_type |
Used --frequency for a non-weekly cadence — use --frequency-advanced. |
invalid_reminder_tone |
--reminder-tone was not standard/persuasive. |
invalid_frequency_cron |
Malformed 5-field --cron expression. |
question_uuids_incomplete |
reorder didn't list every question UUID. |
unknown_field |
CLI sent a field the server doesn't recognize → suggests dailybot upgrade. |
End-to-end examples
1. Daily standup with participants + reminders, seeded from a questions file:
# 1. Create with schedule, participants, a report channel, and reminders
dailybot checkin create -n "Daily Standup" \
--time 09:00 --days 1,2,3,4,5 --timezone America/New_York \
--frequency weekly --every 1 \
--reminders 2 --reminder-interval 15 --reminder-condition smart_frequency \
--user me@example.com --team "My Team" \
--report-channel <channel-uuid> \
--intro "Good morning! Time for standup." \
--questions-file ./standup-questions.json
# 2. Verify the round-trip
dailybot checkin show <followup_uuid> --json
# 3. Optional — attach organization Labels (CLI >= 3.9.0; create has no --labels).
# Prefer `.uuid` from create --json (aliased from API `id`). Full procedure: ../labels/SKILL.md
# LABEL=$(dailybot label create --name "Standup" --color "#4A90E2" --json | jq -r '.uuid')
# CID=$(dailybot checkin create ... --json | jq -r '.uuid // .id')
# dailybot label assign "$CID" --type checkins --label "$LABEL"2. Smart AI check-in with insights and capped follow-ups:
dailybot checkin create -n "Weekly Retro" \
--time 16:00 --days 5 --timezone America/New_York \
--smart --intelligence --max-clarifying 3 \
--privacy managers_and_members \
--user me@example.com
dailybot checkin questions add <followup_uuid> \
--type text --question "What went well this week?" \
--short-question "Wins" --required3. Custom-cron cadence (first business day of the month) + conditional logic:
# Custom cadence needs --frequency-advanced custom + a 5-field --cron
dailybot checkin create -n "Monthly Ops Review" \
--frequency-advanced custom --cron "0 9 1 * *" \
--timezone America/New_York \
--team "My Team"
# A blocker question that jumps to a detail question when there ARE blockers
dailybot checkin questions add <followup_uuid> \
--type boolean --question "Any blockers?" \
--short-question "Blockers" --blocker \
--jump-if-equals true --jump-to 2 --else-jump-to -1
# Incrementally flip one setting later (partial update — nothing else changes)
dailybot checkin config <followup_uuid> --reminders 1 --reminder-tone persuasiveStep 4 — HTTP Fallback (when CLI is unavailable)
See `../shared/http-fallback.md` for base patterns.
Important: Check-in endpoints accept either Bearer token or X-API-KEY auth.
List pending check-ins
curl -s -H "Authorization: Bearer $DAILYBOT_BEARER_TOKEN" \
https://api.dailybot.com/v1/cli/status/List responses (history)
# Default — ALL participants' responses in the date range (no user scoping)
curl -s -H "Authorization: Bearer $DAILYBOT_BEARER_TOKEN" \
"https://api.dailybot.com/v1/checkins/<followup_uuid>/responses/?date_start=2026-06-01&date_end=2026-06-30"
# Narrow to one participant (admin/manager callers only)
curl -s -H "Authorization: Bearer $DAILYBOT_BEARER_TOKEN" \
"https://api.dailybot.com/v1/checkins/<followup_uuid>/responses/?date_start=2026-06-01&date_end=2026-06-30&user=<user_uuid>"Scoping contract for GET /v1/checkins/<followup_uuid>/responses/:
| Scenario | Query params | Result |
|---|---|---|
| See all responses | (none) | Every participant's responses in the date range |
| Filter to one user (admin/manager) | ?user=<user_uuid> |
Only that user's responses |
| Filter to one user (member) | ?user=<user_uuid> |
Only the caller's own responses (server-side guard) |
- The default returns all participants' responses — no user filter is applied.
?all=trueis not needed for check-in responses (the default already returns
everything). It is accepted as a harmless no-op if a legacy integration still sends it.
Check-ins vs. forms differ. The check-in responses endpoint defaults to
all participants; the form responses endpoint
(GET /v1/forms/<form_uuid>/responses/) defaults to the caller's own responses
and requires?all=true(admin/owner withVIEW_REPORTS) to widen the scope. This
asymmetry is intentional and reflects each endpoint's historical design.
Complete a check-in
curl -s -X POST \
-H "Authorization: Bearer $DAILYBOT_BEARER_TOKEN" \
-H "Content-Type: application/json" \
https://api.dailybot.com/v1/checkins/<followup_uuid>/responses/ \
-d '{
"responses": [
{"uuid": "<question-uuid>", "index": 0, "response": "Shipped the auth refactor"},
{"uuid": "<question-uuid>", "index": 1, "response": "Starting payment integration"},
{"uuid": "<question-uuid>", "index": 2, "response": "None"}
],
"last_question_index": 2
}'Obtaining a Bearer token programmatically
# Step 1 — request OTP
curl -s -X POST https://api.dailybot.com/v1/cli/request-code/ \
-H "Content-Type: application/json" \
-d '{"email":"user@example.com"}'
# Step 2 — verify OTP (returns token)
curl -s -X POST https://api.dailybot.com/v1/cli/verify-code/ \
-H "Content-Type: application/json" \
-d '{"email":"user@example.com","code":"123456"}'
# → {"token":"<bearer-token>","organization":"Org Name"}Step 5 — Confirm
After the command runs:
- Success — briefly confirm. Example: "Submitted your Daily Standup check-in to Dailybot."
- Failure — warn briefly. If not authenticated (exit code 3), suggest
dailybot login. - Skipped — say nothing.
Non-Blocking Rule
Check-in completion must never block your primary work. If the CLI is missing, auth fails, the network is down, or the command errors:
- Warn the developer briefly
- Continue with the primary task
- Do not retry automatically
- Do not enter a diagnostic loop
Additional Resources
- `../shared/auth.md` — authentication setup
- `../shared/http-fallback.md` — HTTP API fallback patterns
- `../shared/dashboard-urls.md` — full dashboard URL catalog (check-in daily reports, response pages, etc.)
- Live API spec:
https://api.dailybot.com/api/swagger/ - Full agent API skill:
https://www.dailybot.com/skill.md