API reference · v1

Build with ScanEstate

Every workspace event is available over a JSON REST API. Authenticate with a bearer token and start reading scans, leads, and analytics in minutes.

Base URL
https://api.scanestate.co/v1
Authentication
curl https://api.scanestate.co/v1/properties \
  -H "Authorization: Bearer sk_live_xxx"
Rate limits: 600 req/min · burst 30. All endpoints return JSON with ISO-8601 timestamps in UTC.

Properties

GET
/v1/properties
List all properties in the workspace
Response
{ "data": [{ "id": "p_1", "name": "Marina Loft", "type": "apartment", "price": 3200, "status": "active" }], "total": 42 }
POST
/v1/properties
Create a new property (auto-generates QR)
Request body
{ "name": "Marina Loft", "type": "apartment", "price": 3200, "address": "123 Main St", "city": "SF" }
Response
{ "id": "p_ab12", "qrUrl": "https://scanestate.co/p/p_ab12", "createdAt": "2025-11-01T10:00:00Z" }
GET
/v1/properties/{id}
Get a single property
Response
{ "id": "p_1", "name": "Marina Loft", "scans": 421, "uniqueVisitors": 258 }
PATCH
/v1/properties/{id}
Update property fields
Request body
{ "price": 3400, "status": "leased" }
Response
{ "id": "p_1", "price": 3400, "status": "leased" }
DELETE
/v1/properties/{id}
Archive or delete a property
Response
{ "id": "p_1", "deleted": true }

Leads

GET
/v1/leads
List captured leads, filterable by status/property
Response
{ "data": [{ "id": "l_9", "name": "Emma Chen", "status": "qualified", "score": 78 }], "total": 156 }
POST
/v1/leads
Create a lead (used by the public landing form)
Request body
{ "propertyId": "p_1", "name": "Emma", "email": "e@x.co", "phone": "+1..." }
Response
{ "id": "l_ab12", "status": "new", "score": 42 }
PATCH
/v1/leads/{id}
Update lead status, notes, or assignment
Request body
{ "status": "leased", "note": "Signed 12-mo lease" }
Response
{ "id": "l_9", "status": "leased" }

Scans & analytics

POST
/v1/scans
Ingest a QR scan event (edge endpoint)
Request body
{ "propertyId": "p_1", "fingerprint": "…", "device": "mobile" }
Response
{ "accepted": true, "suspicious": false }
GET
/v1/analytics/portfolio
Portfolio-wide KPI snapshot
Response
{ "scans": 12480, "leads": 1832, "conversion": 0.147, "occupancy": 0.82 }
GET
/v1/analytics/properties/{id}
Per-property time series (14/30/90d)
Response
{ "series": [{ "date": "2025-10-27", "scans": 42, "leads": 6 }] }

Webhooks

POST
webhook: lead.created
Fires when a new lead is captured
Response
{ "type": "lead.created", "data": { "id": "l_9", "propertyId": "p_1" } }
POST
webhook: lead.status_changed
Fires on any status transition
Response
{ "type": "lead.status_changed", "from": "new", "to": "qualified" }
POST
webhook: property.leased
Fires when a property transitions to leased
Response
{ "type": "property.leased", "data": { "id": "p_1" } }

Everything you need to ship integrations

SDKs for JavaScript, Python, and Go · signed webhooks · full OpenAPI 3.1 schema.

Sign in to get keys