Skip to content

Read the housekeeping pacing report

GET
/v1/housekeeping/pacing
curl --request GET \
--url 'https://api.aerandil.com/v1/housekeeping/pacing?property_id=2489E9AD-2EE2-8E00-8EC9-32D5F69181C0' \
--header 'Authorization: Bearer <token>'

The housekeeping pacing report for one property and one business date — hubOS’s productivity report, counted in OPERA’s housekeeping credits. Per attendant: the credit target on their shift that day and the share of it completed (target_percent); credits assigned, completed, in progress and pending (pending or blocked) with their share of the assigned; rooms assigned, cleaned and on do-not-disturb; cleaning_seconds (completed_at − started_at of each complete task), transition_seconds (the gaps between one task’s completion and the attendant’s next start) and deviation_seconds (cleaning time less standard minutes, over the tasks that carry a standard — standard_seconds). The summary adds credits on tasks nobody holds (credits_unassigned), a count of unpriced tasks, and rooms on the board / assigned / cleaned / pending / inspected / on do-not-disturb. Skipped tasks count nowhere.

Credits and standard minutes are what each task was minted with from the property’s housekeeping credit rules (set_housekeeping_credit_rule); targets are set at clock_in or with set_shift_credit_target. A reader not cleared for staff data sees no targets. Computed on read from the tasks and shifts — the same value hospitality.function.housekeeping_pacing returns.

Live data: always Cache-Control: no-store.

property_id
required
string format: uuid

The property whose floor to read.

business_date
string format: date

The business date, YYYY-MM-DD; omitted, the property’s local calendar day — the day its housekeeping sheet is dated by.

The report. A day with no tasks is an empty report, not a 404.

Media typeapplication/json
object
attendants
required
Array<object>
object
cleaning_seconds
required
integer
completed_percent
string format: decimal
contracted_weekly_hours
string format: decimal
credit_target
string format: decimal
credits_assigned
required
string format: decimal
credits_completed
required
string format: decimal
credits_in_progress
required
string format: decimal
credits_pending
required
string format: decimal
deviation_seconds
required
integer
in_progress_percent
string format: decimal
inspection_rating_average
string format: decimal
inspections
required
integer
pending_percent
string format: decimal
percentage_worked
string format: decimal
rooms_assigned
required
integer
rooms_cleaned
required
integer
rooms_dnd
required
integer
self_rating_average
string format: decimal
self_ratings
required
integer
staff_member_id
required
string format: uuid
standard_seconds
required
integer
target_percent
string format: decimal
time_worked_seconds
integer
transition_seconds
required
integer
business_date
required
string format: date
property_id
required
string format: uuid
summary
required
object
cleaning_seconds
required
integer
completed_percent
string format: decimal
credits_assigned
required
string format: decimal
credits_completed
required
string format: decimal
credits_in_progress
required
string format: decimal
credits_pending
required
string format: decimal
credits_unassigned
required
string format: decimal
deviation_seconds
required
integer
in_progress_percent
string format: decimal
pending_percent
string format: decimal
rooms
required
integer
rooms_assigned
required
integer
rooms_cleaned
required
integer
rooms_dnd
required
integer
rooms_inspected
required
integer
rooms_pending
required
integer
standard_seconds
required
integer
tasks_unpriced
required
integer
transition_seconds
required
integer
Examplegenerated
{
"attendants": [
{
"cleaning_seconds": 1,
"completed_percent": "example",
"contracted_weekly_hours": "example",
"credit_target": "example",
"credits_assigned": "example",
"credits_completed": "example",
"credits_in_progress": "example",
"credits_pending": "example",
"deviation_seconds": 1,
"in_progress_percent": "example",
"inspection_rating_average": "example",
"inspections": 1,
"pending_percent": "example",
"percentage_worked": "example",
"rooms_assigned": 1,
"rooms_cleaned": 1,
"rooms_dnd": 1,
"self_rating_average": "example",
"self_ratings": 1,
"staff_member_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"standard_seconds": 1,
"target_percent": "example",
"time_worked_seconds": 1,
"transition_seconds": 1
}
],
"business_date": "2026-04-15",
"property_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"summary": {
"cleaning_seconds": 1,
"completed_percent": "example",
"credits_assigned": "example",
"credits_completed": "example",
"credits_in_progress": "example",
"credits_pending": "example",
"credits_unassigned": "example",
"deviation_seconds": 1,
"in_progress_percent": "example",
"pending_percent": "example",
"rooms": 1,
"rooms_assigned": 1,
"rooms_cleaned": 1,
"rooms_dnd": 1,
"rooms_inspected": 1,
"rooms_pending": 1,
"standard_seconds": 1,
"tasks_unpriced": 1,
"transition_seconds": 1
}
}
Cache-Control
string

Always no-store — live data.

Token does not hold the function’s grant — functions:hospitality.function.housekeeping_pacing:invoke (a housekeeping supervisor’s handset carries it; an attendant’s and a runner’s do not) or the catch-all functions:invoke — or the session (a desk’s or a handset’s) is bound to another property.

Media typeapplication/json

Structured error wrapper. Every non-2xx response from any Aerandil endpoint serialises to this shape; the HTTP status carries the failure class (4xx/5xx), the body adds a stable code for programmatic dispatch plus a human-readable message.

object
error
required
object
code
required

Stable, programmatic error code (e.g. unauthorized, forbidden, not_found, invalid_body, invalid_url, precondition_failed, no_secondary_key). Clients dispatch on code, not on the message (which may be localised or contextualised in future versions).

string
instance_id

Request-id correlation handle echoed on the request-id response header — support teams correlate without scraping logs.

string
message
required

Human-readable explanation of the failure.

string
parameters

Per-error structured detail. The shape varies by code (e.g. forbidden_action carries {"action": "..."}; precondition_failed carries {"current_version": N}).

Examplegenerated
{
"error": {
"code": "example",
"instance_id": "example",
"message": "example",
"parameters": "example"
}
}

No such property.

Media typeapplication/json

Structured error wrapper. Every non-2xx response from any Aerandil endpoint serialises to this shape; the HTTP status carries the failure class (4xx/5xx), the body adds a stable code for programmatic dispatch plus a human-readable message.

object
error
required
object
code
required

Stable, programmatic error code (e.g. unauthorized, forbidden, not_found, invalid_body, invalid_url, precondition_failed, no_secondary_key). Clients dispatch on code, not on the message (which may be localised or contextualised in future versions).

string
instance_id

Request-id correlation handle echoed on the request-id response header — support teams correlate without scraping logs.

string
message
required

Human-readable explanation of the failure.

string
parameters

Per-error structured detail. The shape varies by code (e.g. forbidden_action carries {"action": "..."}; precondition_failed carries {"current_version": N}).

Examplegenerated
{
"error": {
"code": "example",
"instance_id": "example",
"message": "example",
"parameters": "example"
}
}

Malformed business_date.

Media typeapplication/json

Structured error wrapper. Every non-2xx response from any Aerandil endpoint serialises to this shape; the HTTP status carries the failure class (4xx/5xx), the body adds a stable code for programmatic dispatch plus a human-readable message.

object
error
required
object
code
required

Stable, programmatic error code (e.g. unauthorized, forbidden, not_found, invalid_body, invalid_url, precondition_failed, no_secondary_key). Clients dispatch on code, not on the message (which may be localised or contextualised in future versions).

string
instance_id

Request-id correlation handle echoed on the request-id response header — support teams correlate without scraping logs.

string
message
required

Human-readable explanation of the failure.

string
parameters

Per-error structured detail. The shape varies by code (e.g. forbidden_action carries {"action": "..."}; precondition_failed carries {"current_version": N}).

Examplegenerated
{
"error": {
"code": "example",
"instance_id": "example",
"message": "example",
"parameters": "example"
}
}