Your platform already collects inspections, certificates, and test reports. Send them to GuestMate and they land as compliance evidence in the city's system of record — mapped to the right obligation, in the right jurisdiction, automatically.
GuestMate is the compliance layer the building subscribes to underneath — not a replacement for your software. Your customer keeps using you; you just route their evidence to the city.
Publish against a stable evidence type once. We map it to each city's obligations — you don't track local codes.
Every submission carries your identity and a timestamp. The city sees exactly who attested what, and when.
You bind to an evidence type — a stable data shape. What that evidence satisfies under a given city's code lives inside GuestMate. You never touch the compliance engine.
Choose from the catalog — e.g. sprinkler_inspection. Each has a published schema.
Send the fields for a property you're authorized to submit for. JSON in, receipt out.
Our engine resolves which obligation(s) this satisfies for that property's jurisdiction — privately.
The obligation turns current in the city's dashboard, with your attestation on the record.
The complete, authoritative reference. Each type below lists its full field schema — key, data type, and whether it's required. Bind to the ones your platform already produces.
This list is generated from GuestMate's live evidence-type registry, so it stays current as types are added. Missing one you produce? Tell us and we'll add it.
Every submission is a document: the signed inspection report, the certificate, the COI. You send the structured fields and the file together in one request — exactly what a person does in the GuestMate dashboard, just over the API.
# One request carries the fields AND the file. # Send as multipart/form-data, not JSON. curl https://guestmate.us/developers/api/v1/evidence \ -H "Authorization: Bearer gm_sandbox_…" \ -F 'community_ref=DMO01' \ -F 'evidence_type=fire_extinguisher_service' \ -F 'property_ref=OCEANBREEZE-UNIT-208' \ -F 'values={"service_date":"2026-03-01", "next_service_due":"2027-03-01", "overall_result":"pass"};type=application/json \ -F 'file=@/path/to/service-report.pdf' # The structured values go in the "values" part. # The document goes in the "file" part.
One document per submission. Each evidence record is one file plus its fields. To submit several reports, make several requests. Re-uploading the identical file is de-duplicated automatically (files are content-addressed by SHA-256), so retries are safe.
Wrong type or over the limit? You get a specific error — unsupported_file_type (with the detected MIME) or file_too_large_25mb — never a silent failure.
Paste or edit an evidence payload. We validate its shape against the published schema — the same check the API runs on ingest. Runs entirely in your browser; nothing is sent anywhere.
This checks the values part only. In a real request the document (PDF/JPG/PNG) rides alongside as a multipart file — see Submitting the document. Whether valid evidence satisfies an obligation is decided by the compliance engine and returned by the live API — not exposed here.
The most common submission. Here's the exact schema and a request that lands as evidence on a Delray Beach property — with no knowledge of Delray's fire code required on your side.
| Field | Type | Req |
|---|
# file part → the service report PDF file = @service-report.pdf community_ref = DMO01 evidence_type = fire_extinguisher_service property_ref = OCEANBREEZE-UNIT-208 # values part → the structured fields (JSON) values = { "service_date": "2026-03-01", "next_service_due": "2027-03-01", "contractor_name": "Acme Fire", "contractor_certification_number": "FE-12345", "extinguisher_count_total": 12, "extinguisher_count_passed": 12, "extinguisher_count_failed": 0, "overall_result": "pass" }
{
"status": "accepted",
"submission_id": "ev_9Fk2…",
"obligation_satisfied": true,
"valid_until": "2027-03-01",
"attested_by": "Acme Fire (vendor)",
"file": {
"mime_type": "application/pdf",
"size_bytes": 184320,
"sha256": "7d9f…c2a1"
}
}
Get a working sandbox key instantly — no review, no waiting. It submits against demo properties with zero risk to real data. Production keys are issued by our team once you're ready to go live.
Instant and free. The key is issued right here and works immediately against the sandbox.
No. The building subscribes to GuestMate for compliance — that subscription is what enables this API connection — but GuestMate doesn't replace your product or run your customer relationship. You keep collecting data and serving the building the way you do today; we're the compliance layer underneath.
No — that's the point. You bind to an evidence type (a data shape). GuestMate decides what that evidence satisfies under each jurisdiction's code. When a city changes its rules, nothing changes on your side.
Nothing. You don't pay GuestMate — the building does, through its GuestMate compliance subscription, and that's what enables the connection you feed. We don't meter your submissions: the more evidence flows in, the more complete the city's compliance picture, which is what the subscription actually pays for.
Two layers. Shape validation (public — you can run it yourself, above, and in the sandbox) checks the payload against the schema. Obligation validation (private, in our engine) decides what a valid submission satisfies. You get a clear accepted/rejected result plus the outcome, never the internal rules.
Send it in the same request. Evidence submissions are multipart/form-data: the structured fields go in a values part and the document goes in a file part. Accepted formats are PDF, JPG, PNG, and HEIC, up to 25 MB, detected by content (not file extension). Every file is hashed (SHA-256), stored, and deduplicated. See Submitting the document for the full spec.
It's recorded with your identity and can be marked disputed or superseded. You're the attester; GuestMate is the ledger. The city's audit trail shows exactly what was submitted, by whom, and when.