Inspection Reports
The inspection template turns photographs collected over chat into a finished property inspection PDF. It is not an ordinary PDF Generator render: your flow does not build the report body. The server keeps the photographs, groups them into areas, and lays out the document. Your flow sends only the property details and the exceptions.
Use this page when you build or change an inspection flow.
How a flow talks to it
An inspection uses two endpoints:
| Step | Endpoint | What it does |
|---|---|---|
| During the inspection | POST /api/v1/inspection/capture | Records each batch of photographs against the current area |
| At the end | POST /api/v1/pdf/render | Claims the recorded photographs and renders the report |
Photographs are recorded as they arrive, so a long inspection is never held in memory. The render step claims them once — a second render of the same session does not repeat photographs, and a render for a session with nothing pending produces no file at all.
What you send
The render call carries a source object:
{
"templateId": "inspection",
"source": {
"type": "inspection",
"sessionId": "whatsapp-447700900000-447700900001",
"meta": {
"address": "12 Elm Road, Flat 3, London HA12 3NF",
"assessor": "Jane Doe",
"company": "Inspection Experts",
"reportType": "checkin",
"guided": false,
"propertyNo": "12",
"postcode": "HA12 3NF"
}
}
}
meta fields
| Field | Description |
|---|---|
address | Property address, printed on the cover |
assessor | Inspector name — cover, and the clerk signature line |
tenant | Tenant name — the tenant signature line. Omit to leave it blank |
company | Operator company name on the cover |
reportType | interim, checkin or checkout. Anything else falls back to a neutral title |
guided | true only for a tenant-led self inspection — prints Guided Self Inspection on the cover |
propertyNo, postcode | Used for the emailed filename <YYYYMMDD> <propertyNo> <postcode>.pdf |
logo | Asset reference for the cover logo |
geo | { latitude, longitude } — printed as a coordinate plus a map link |
areaComments | { "Bedroom 1": ["remark", …] } — printed under that area as Additional Comment |
keyDetails | { numberOfKeys, takenFrom, handedTo } — printed in the Keys section |
skippedAreas | Service areas the inspector reported absent — see below |
Every field is optional. Anything the server does not recognise is dropped rather than printed —
with one exception worth knowing: address, assessor, tenant and company are printed on the
cover exactly as you send them, with no length cap. Nothing can be injected through them (every
value is escaped), but nothing tidies them up either, so send them already correct.
Areas the property does not have
A check-in or check-out report expects five service areas: the electricity, gas and water meters, the keys, and the detectors. Not every property has all five.
Send skippedAreas as a pipe-separated list drawn from this set:
electricity-meter | gas-meter | water-meter | keys | detectors
Each one prints a short note instead of vanishing from the report:
Detectors
Not available — reported by the inspector.
The note matters: without it a reader cannot tell "this property has no detectors" from "somebody forgot the detectors". An area you list but photograph anyway keeps its photographs and gets no note.
Force-finishing an inspection waives every outstanding area at once, so a genuinely forgotten one passes unnoticed. Listing the single absent area keeps the rest of the check in place.
Where comments appear
Free-text remarks are recorded against the area being inspected at that moment and close that area — they print after the photographs, not between the area table and the images.
Every part of the report accepts them, not just numbered rooms:
| Section | Key to use |
|---|---|
| A room | Its label — "Bedroom 1" |
| External Areas | The pooled heading, or any room inside it ("Garden") — all are merged |
| Meters & Keys | The area name — "Gas Meter", "Keys" |
| An area reported absent | Its name. The remark prints under the note, recording why it was skipped |
Capitalisation, extra spaces and - or / separators do not affect the match: bedroom-1 and
Bedroom 1 are the same area. A remark whose area appears nowhere in the report is dropped rather
than printed without a heading.
When each photograph was taken
Every photograph prints its own timestamp in UK civil time, with the zone named — 14 Aug 2026, 18:02 BST. The zone matters: on the October clock change two photographs an hour apart both read
01:30, and only BST vs GMT tells them apart.
The time comes from captureTs on the capture call, which is when WhatsApp says the message was
sent. Send it every time. If you leave it out, the report falls back to when the server received
the photograph instead — usually close, but a retry, a queue backlog or a phone with no signal in a
basement can move it by hours, and the report gives the reader no hint that it happened.
Troubleshooting
The report has no photographs
The capture calls did not reach the same environment the flow is running in. A 404 from
/api/v1/inspection/capture means the flow id does not exist on that host. The render then produces
nothing at all rather than an empty report.
The report keeps asking for an area the property does not have
The area is one of the five service areas and has neither photographs nor a skippedAreas entry. Add
its slug to skippedAreas.
The cover title is wrong
reportType did not match interim, checkin or checkout — a misspelling falls back to the neutral
title. A mistyped type also changes which areas are required, so check it before the inspection starts.
The cover says "Guided Self Inspection" for an inspector
guided was sent as true. Send false whenever the session belongs to an inspector rather than a
tenant walking through the property themselves.
Related
- PDF Generator — the node that posts the render call
- Prediction API