-
Notifications
You must be signed in to change notification settings - Fork 15
REST API Morning Checks
The complete usage guide for the Morning Checks module of the REST API β the daily operational checklist. Mirrors the interactive documentation at System β API β Documentation (with its live "Try it" tester).
Note
New to the API? The basics table on REST API: Tickets covers base URL, authentication, the response envelope, error codes, rate limits and PATCH semantics β identical across all modules.
What's distinctive about Morning Checks:
| π One result per check per day | Recording is an upsert β POST /morning-checks/results for a check + date that already has a result overwrites it (200) rather than creating a second (a first record is a 201). That's the dashboard's exact behaviour, and it's backed by a database unique key. |
| π€ Built for automated checking | The whole point of exposing this module: a script that probes your backups/mail-flow/VPN each morning can record Green/Amber/Red itself, and the team dashboard fills in before anyone sits down. Results recorded via the API stamp created_by with the key's acting analyst. |
| ποΈ Plain dates, not timestamps | A check happens on a day β date values are bare YYYY-MM-DD (defaulting to today, server-local, like the dashboard). created_at/modified_at are normal UTC ISO timestamps. |
| π Notes rules enforced | Statuses flagged requires notes in Settings (Red by default) reject an empty notes field with a 422 β same rule as the dashboard's notes modal. |
| π» Orphans surfaced | If an admin deletes a status option, historical results saved against it keep a label snapshot. Those rows come back with is_orphan: true + orphan_label, and ?orphans=true lists them β the dashboard's warning-banner set. |
B="https://your-server/api/v1"; K="Authorization: Bearer fitsm_β¦"
# What's on the board and what's already been done today?
curl -s "$B/morning-checks/board" -H "$K"
# Probe passed β record Green for check 3
curl -s -X POST "$B/morning-checks/results" -H "$K" -H "Content-Type: application/json" \
-d '{"check_id": 3, "status": "Green"}'
# Probe failed β Red requires notes
curl -s -X POST "$B/morning-checks/results" -H "$K" -H "Content-Type: application/json" \
-d '{"check_id": 3, "status": "Red", "notes": "Overnight Veeam job failed on VM-SQL01."}'
# Ran it again an hour later and things recovered β same call simply overwrites today's result
curl -s -X POST "$B/morning-checks/results" -H "$K" -H "Content-Type: application/json" \
-d '{"check_id": 3, "status": "Green", "notes": "Job re-ran clean."}'Every active check with its result for one date (?date=YYYY-MM-DD, default today) β the dashboard's exact view. result is null for checks not yet done:
{ "data": { "date": "2026-07-03", "checks": [
{ "id": 3, "name": "Backup Status", "description": "Check overnight backup jobs completed", "sort_order": 2,
"result": { "id": 731, "status": { "id": 1, "label": "Green", "colour": "#28a745" },
"is_orphan": false, "orphan_label": null, "notes": "" } },
{ "id": 4, "name": "VPN Gateway", "description": null, "sort_order": 3, "result": null } ] } }Record (or overwrite) a result β the integration verb.
| Field | Notes |
|---|---|
check_id |
Required. Unknown ids are a 422 (the UI would 500 on the foreign key). |
status or status_id
|
Required. Label (e.g. "Green") or id; must exist and be active. |
notes |
Required when the status is flagged requires notes, optional otherwise. |
date |
YYYY-MM-DD, default today. Malformed dates are a 422 β the internal endpoint silently substitutes today, which is exactly wrong for a machine backfilling yesterday. |
201 on the first record for that check + date, 200 when overwriting an existing one (same row, status/notes replaced β one result per check per day).
Result history, newest date first, paginated. Filters: check_id, status_id, date (exact), from / to (inclusive bounds), and orphans=true for only the rows whose status has since been deleted.
One result:
{ "data": { "id": 731, "check": { "id": 3, "name": "Backup Status" }, "date": "2026-07-03",
"status": { "id": 2, "label": "Amber", "colour": "#ffc107" },
"is_orphan": false, "orphan_label": null, "notes": "Minor delays on one job.",
"created_by": "Administrator", "created_at": "2026-07-03T07:02:11Z", "modified_at": "2026-07-03T08:15:40Z" } }There is deliberately no DELETE for results β the module has no such operation (correcting a mistake is just re-POSTing the right status for that date).
All check definitions (active and inactive) in board order. is_active=true|false filters; q searches names.
Only name is required; description, sort_order, is_active optional.
PATCH sends only what changes. Deactivating (is_active: false) removes a check from the board but keeps its history β usually what you want.
Removes the check and all its historical results, transactionally. Prefer deactivating.
The configurable status options (Green / Amber / Red by default) with colour, requires_notes and is_active β inactive ones included so historical results always resolve:
{ "data": [ { "id": 1, "label": "Green", "colour": "#28a745", "requires_notes": false, "sort_order": 10, "is_active": true } ] }| Group | Actions |
|---|---|
Morning checks (morning_checks) |
read Β· create Β· update Β· delete β the check definitions |
Morning check results (morning_check_results) |
read (board + history) Β· record (the daily upsert) |
A typical monitoring key needs only morning_check_results.record (plus read if it wants to see what's outstanding first).
Morning Checks is install-wide β no company scoping (matches the UI) β and the module has no audit trail.
FreeITSM β an open-source IT Service Management platform Β· github.com/edmozley/freeitsm Β· MIT licence
- Installation
- β° Scheduled tasks (cron jobs)
- Architecture
- AI Providers
- Internationalisation (i18n)
- Timezones & Time Handling
- Theming & Dark Mode
- β¨οΈ Command palette (βK)
- π Searching inside tickets
- π Attached documents
- MobileβFriendly
-
Security
- Layer 1 β which modules you can enter
- β³ π§© Module Access Control
- β³ π οΈ Module Access β Developer Guide
- Layer 2 β what you can administer
- β³ π Roles & Permissions
- β³ π οΈ Roles β Developer Guide
- β³ π€ Why capabilities are constants
- Layer 3 β the System module
- β³ π Admin Access Control
- Hardening
- β³ π Security review response 2026-08
- β³ π‘οΈ Security hardening 2026-08
- β³ π οΈ Security hardening 2026-08 β Developer Guide
- β³ π‘οΈ Round three β plain English
- β³ π οΈ Round three β Developer Guide
- Single Sign-On (SSO)
- ποΈ LDAP & Active Directory
- Browser Extension
- API Reference
-
π REST API β how it works
- β³ π« REST API: Tickets
- β³ π» REST API: Assets
- β³ π΄ REST API: Problems
- β³ π REST API: Changes
- β³ π REST API: Knowledge
- β³ β REST API: Tasks
- β³ ποΈ REST API: CMDB
- β³ π REST API: Contracts
- β³ ποΈ REST API: Calendar
- β³ πΏ REST API: Software
- β³ π¦ REST API: Service Status
- β³ βοΈ REST API: Morning Checks
- β³ π REST API: Forms
- β³ βοΈ REST API: Workflow
- β³ πΊοΈ REST API: Network Mapper
- β³ π§ Using the API docs page
- β³ π OpenAPI specification
- β³ β OpenAPI: kept correct
- β³ π οΈ Maintaining the catalogue
- Watchtower
-
Tickets
- β³ Mailbox Authentication
- β³ π€ Email send log
- β³ Basic IMAP mailboxes
- β³ Email rendering & images
- β³ SLA Management
- β³ WhatsApp channel
- β³ π¬ Web chat channel
- β³ π£ Slack channel
- β³ π Linking tickets
- β³ ποΈ Canned responses
- β³ βοΈ Limiting replies to particular senders
- β³ βοΈ Email signatures
- β³ π The public web address
- β³ π’ Ticket numbering
- β³ π Raising a ticket for someone else
- β³ π Merging tickets
- β³ β Splitting tickets
- β³ β Selecting several tickets
- β³ π οΈ Snoozing tickets β Developer Guide
- β³ π₯ Collision detection
- β³ β±οΈ Time tracking
- Problem Management
- Tasks
- Assets
- Knowledge
- Change Management
- Calendar
- Morning Checks
- Reporting
- Software
- Forms
- Contracts
- Service Status
- π Notifications
- π¨ War Room
- Self-Service Portal
- LMS
- Process Mapper
- CMDB
- Network Mapper
- Workflows
- Issue trackers (Jira, Azure DevOps)
- System
-
Overview
- β³ π Progress tracker
- β³ Concepts & vocabulary
- β³ Email routing & mailboxes
- β³ Settings: global vs per-company
- β³ Users & self-service
- β³ Staff cross-company access
- β³ Worked examples
- β³ Pitfalls & gotchas
- β³ Scope: what it's for
- β³ π οΈ Developer Guide (make a module multi-company)
- β³ ποΈ Case study: CMDB (a linked graph)
- β³ π§ͺ Test harness (prove it's isolated)