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.
POST /jobs/:key/start
Section titled “POST /jobs/:key/start”Starts the clock. No body.
curl -X POST "https://api.myrentalcalendar.com/partner/v1/cleaning/jobs/turnover:0191a…/start" \ -H "Authorization: Bearer $KEY"| HTTP | Body | Meaning |
|---|---|---|
| 201 | { "ok": true, "startedAt": "2026-09-04T12:40:11.000Z" } | Started now |
| 200 | { "ok": true, "startedAt": "…" } | Was already started — the original time is kept |
| 404 | NOT_FOUND | No such job of this crew |
| 409 | ALREADY_DONE | The job is already reported as finished |
POST /jobs/:key/finish
Section titled “POST /jobs/:key/finish”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.
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" }'| Field | Required | Notes |
|---|---|---|
notes | no | Up 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.
POST /jobs/:key/reopen
Section titled “POST /jobs/:key/reopen”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.
| HTTP | Body | Meaning |
|---|---|---|
| 200 | { "ok": true } | Reopened |
| 404 | NOT_FOUND | No such job of this crew, or nothing to reopen |
A morning in three calls
Section titled “A morning in three calls”const plan = await api("/plan?date=2026-09-04"); // the routefor (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 } });}