Skip to content

Reports

Three writes, all needing cleaning:write:reports. The :key is the job key from GET /jobs or GET /plan: turnover:<bookingId> or midstay:<bookingId>:<YYYY-MM-DD>. A key that is not this crew’s — another partner’s unit, a job the office handed away, a made-up date — answers 404 NOT_FOUND, never “exists, but not yours”.

Reports through a key land in the same rows as taps in the cleaning portal. The agency’s audit trail records each one with the key as the actor.

Starts the clock. No body.

Terminal window
curl -X POST "https://api.myrentalcalendar.com/partner/v1/cleaning/jobs/turnover:0191a…/start" \
-H "Authorization: Bearer $KEY"
HTTPBodyMeaning
201{ "ok": true, "startedAt": "2026-09-04T12:40:11.000Z" }Started now
200{ "ok": true, "startedAt": "…" }Was already started — the original time is kept
404NOT_FOUNDNo such job of this crew
409ALREADY_DONEThe job is already reported as finished

Marks the job done and mirrors it into what the office watches: a turnover sets the apartment’s cleaned badge on the agency calendar and the guest-ready lane of the ops board; a mid-stay cleaning confirms that week. Finishing without a start is fine — not every job is worth two calls — minutes is then null.

Terminal window
curl -X POST "https://api.myrentalcalendar.com/partner/v1/cleaning/jobs/turnover:0191a…/finish" \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{ "notes": "Left a broken lamp in the bedroom for the office" }'
FieldRequiredNotes
notesnoUp to 500 characters, shown to the office with the job
{ "ok": true, "finishedAt": "2026-09-04T14:55:02.000Z", "minutes": 135 }

404 NOT_FOUND for a job that is not this crew’s. Finishing an already finished job updates the timestamp and notes — the last word counts.

Undoes a finish: clears the report’s finish time and minutes, and takes back the mirrored confirmation. A mid-stay cleaning the office marked as declined by the guest is not the crew’s to undo and stays as it is. No body.

HTTPBodyMeaning
200{ "ok": true }Reopened
404NOT_FOUNDNo such job of this crew, or nothing to reopen
const plan = await api("/plan?date=2026-09-04"); // the route
for (const stop of plan.stops.filter((s) => s.status === "open")) {
await api(`/jobs/${stop.key}/start`, { method: "POST" }); // crew arrives
// … work …
await api(`/jobs/${stop.key}/finish`, { method: "POST", body: { notes: null } });
}