Download OpenAPI specification:
This is the API to interact with Site App Pro.
All dates and times in this API — in both requests and responses, e.g. answerDate, whenCreated, whenLastModified, from, to — are represented as epoch milliseconds: the number of milliseconds elapsed since the Unix epoch (00:00:00 UTC on 1 January 1970 — see Unix time). This value is always UTC, so there is no separate time zone offset to account for.
For example, 1770152764556 corresponds to 2026-02-03T21:06:04.556Z.
Most languages provide a built-in way to convert this value to a native date/time object, for example:
new Date(1770152764556)datetime.fromtimestamp(1770152764556 / 1000, tz=timezone.utc)To ensure stability and fair usage, this API enforces rate limiting based on a token bucket algorithm.
Limits are governed by two factors: a steady-state request rate (requests per second) and a maximum burst capacity. If you sustain a traffic volume higher than the allowed rate, or if you send a sudden spike of traffic that exceeds the burst capacity, the API will reject the excess requests and respond with an HTTP 429 Too Many Requests status code.
We strongly encourage all clients and automated integrations to implement exponential backoff with jitter when handling 429 responses. Attempting to immediately retry failed requests without a delay queue will result in sustained rejections and degraded performance.
Informs webhook listener (i.e. subscription target URL) that a new Staff record has been created.
| X-Hook-Signature required | string The HMAC-SHA1 signature of the raw request body, generated using the system-provided X-Hook-Secret as the cryptographic key, and formatted as a hexadecimal digest. |
| payload required | string A new Staff record, a new Site, updated Site or a completed Form instance |
required | object (WebSubscriptionHook) |
{- "payload": "A new Staff record, a new or updated Site record or a completed Form instance",
- "hook": {
- "id": "string",
- "target": "string",
- "event": "string"
}
}Informs listener (i.e. subscription target url) that a new Site has been created.
| X-Hook-Signature required | string The HMAC-SHA1 signature of the raw request body, generated using the system-provided X-Hook-Secret as the cryptographic key, and formatted as a hexadecimal digest. |
| payload required | string A new Staff record, a new Site, updated Site or a completed Form instance |
required | object (WebSubscriptionHook) |
{- "payload": "A new Staff record, a new or updated Site record or a completed Form instance",
- "hook": {
- "id": "string",
- "target": "string",
- "event": "string"
}
}Informs listener (i.e. subscription target url) that a Site has been updated.
| X-Hook-Signature required | string The HMAC-SHA1 signature of the raw request body, generated using the system-provided X-Hook-Secret as the cryptographic key, and formatted as a hexadecimal digest. |
| payload required | string A new Staff record, a new Site, updated Site or a completed Form instance |
required | object (WebSubscriptionHook) |
{- "payload": "A new Staff record, a new or updated Site record or a completed Form instance",
- "hook": {
- "id": "string",
- "target": "string",
- "event": "string"
}
}Informs listener (i.e. subscription target url) that a Form Instance has been completed.
| X-Hook-Signature required | string The HMAC-SHA1 signature of the raw request body, generated using the system-provided X-Hook-Secret as the cryptographic key, and formatted as a hexadecimal digest. |
required | object (CompletedFormInstancePayload) The completed Form Instance, plus a temporary link to its generated PDF report. |
required | object (WebSubscriptionHook) |
{- "payload": {
- "formInstanceId": 44924,
- "latitude": null,
- "longitude": null,
- "whenCreated": 1787795495188,
- "whenLastModified": 1787795497129,
- "formCategory": "Check In",
- "answerDate": 1787795494793,
- "maxScore": null,
- "actualScore": null,
- "passPercentage": null,
- "siteName": "Example Site",
- "pinnedInstance": false,
- "formName": "Check In Check Out",
- "formTypeName": "Check In",
- "createdByStaffName": "Jane Doe",
- "lastModifiedByStaffName": "Jane Doe",
- "fileUrl": "<temporary URL to the generated PDF>"
}, - "hook": {
- "id": "141",
- "target": "<your registered webhook target URL>",
- "event": "formInstance.complete"
}
}Returns an array of completed and incomplete form instances for the authenticated organisation.
| from | integer <int64> Example: from=1770083945000 Filter forms submitted from this date (in epoch milliseconds). |
| to | integer <int64> Example: to=1770152764000 Filter forms submitted up to this date (in epoch milliseconds). |
| category | string Example: category=Others Filter by form category. |
| name | string Example: name=Example Form Filter by exact form name. |
| x-organisation-id required | string Specifies the target Organisation ID for the request context. |
[- {
- "formInstanceId": 76484,
- "answerDate": 1770152764556,
- "isComplete": true,
- "latitude": -36.9110991,
- "longitude": 174.6600517,
- "maxScore": null,
- "actualScore": null,
- "passPercentage": null,
- "formName": "Example Form",
- "combinedActionRequired": "",
- "bulletinSummary": null,
- "whenCreated": 1770152771331,
- "whenLastModified": 1770152780097,
- "formCategory": "Others",
- "pinnedInstance": null,
- "formTypeName": "General Task",
- "createdByStaffName": "Jane Doe",
- "lastModifiedByStaffName": "Jane Doe",
- "siteName": null,
- "siteId": null
}
]Create a new user in your organisation.
| x-organisation-id required | string Specifies the target Organisation ID for the request context. |
User to be added to your Organisation
| firstName required | string |
| lastName required | string |
| email required | string |
{- "firstName": "First name",
- "lastName": "Surname",
- "email": "admin@example.com"
}{- "firstName": "First name",
- "lastName": "Surname",
- "email": "admin@example.com",
- "roleName": "Tablet",
- "externalId": "ExtId",
- "organisationId": 1234,
- "organisationName": "Org Name",
- "organisationGroupName": "Org Group Name",
- "whenCreated": 0
}Adds a new Site to your organisation.
| x-organisation-id required | string Specifies the target Organisation ID for the request context. |
Site to be added to your Organisation
| name required | string |
| isActive | boolean |
| category | string |
| address | string |
| latitude | number <float> |
| longitude | number <float> |
string | |
| phoneNumber | string |
| contactName | string |
| projectManager | string |
| safetyManager | string |
| notes | string |
| externalId | string |
| scheduledStartDate | integer <int64> |
| scheduledEndDate | integer <int64> |
| status | string |
{- "name": "SiteName",
- "isActive": true,
- "category": "siteCategory",
- "address": "Auckland",
- "latitude": 0.1,
- "longitude": 0.1,
- "email": "site@example.com",
- "phoneNumber": "021123456",
- "contactName": "Site Contact",
- "projectManager": "Site Project Manager",
- "safetyManager": "Site Safety Manager",
- "notes": "Notes",
- "externalId": "Site External Id",
- "scheduledStartDate": 0,
- "scheduledEndDate": 0,
- "status": "Status"
}{- "name": "SiteName",
- "organisationId": 1234,
- "isActive": true,
- "category": "siteCategory",
- "address": "Auckland",
- "latitude": 0.1,
- "longitude": 0.1,
- "email": "site@example.com",
- "phoneNumber": "021123456",
- "contactName": "Site Contact",
- "projectManager": "Site Project Manager",
- "safetyManager": "Site Safety Manager",
- "notes": "Notes",
- "externalId": "Site External Id",
- "scheduledStartDate": 0,
- "scheduledEndDate": 0,
- "status": "Status",
- "formCompletionEmailList": "Notes",
- "whenCreated": 0,
- "createdByUserId": 0,
- "whenLastModified": 0,
- "lastModifiedByUserId": 0,
- "whenArchived": 0,
- "archivedByUserId": 0,
- "whenDeleted": 0,
- "deletedByUserId": 0,
- "parentId": 0,
- "pin": "1234",
- "reportFooter": "Footer",
- "pcbuOption": "",
- "counterContact": "",
- "counterBusinessName": "",
- "counterPhoneNumber": "",
- "firstAidContact": "",
- "notifiableWorks": "",
- "taskAnalysis": "",
- "accidentReporting": "",
- "hazardousSubstances": "",
- "trainingCompetency": "",
- "subcontractors": "",
- "environmentNeighbourhood": "",
- "communications": "",
- "pinnedInitialFormIds": "",
- "agreementSummaryLastModified": 0,
- "notifiableWorksLastModified": 0,
- "taskAnalysisLastModified": 0,
- "accidentReportingLastModified": 0,
- "hazardousSubstancesLastModified": 0,
- "trainingCompetencyLastModified": 0,
- "environmentNeighbourhoodLastModified": 0,
- "communicationsLastModified": 0,
- "siteCode": "",
- "siteClosedTime": "",
- "latestCheckOutNotificationTime": 0,
- "entryNotes": "",
- "outlineOfWork": "",
- "otherTaskAnalysis": ""
}Archives Sites in your Site App Pro Organisation.
| x-organisation-id required | string Specifies the target Organisation ID for the request context. |
Site to be archived in your Organisation
| siteId required | integer The internal Site App Pro ID. |
{- "externalId": "foo-bar-123456"
}1Registers a new webhook subscription. The user and organisation IDs are dynamically derived from your authentication token.
Activating your subscription
Immediately after this call succeeds, we send a one-time handshake request to your targetUrl to confirm it is ready to receive events. This handshake is not retried, so your endpoint must already be live and reachable before you call this operation, or the subscription will never activate.
POST to your targetUrl with an X-Hook-Secret: <uuid> header and Content-Type: application/json, but no body. Your endpoint must not reject the missing body.X-Hook-Secret header. We only check that the header is present, but you should echo back the exact value we sent.200 is the recommended response.xHookSecret field (and the X-Hook-Secret response header) on the create call itself.If the handshake can't reach your endpoint, the subscription stays inactive and no webhook events will be delivered. Create a new subscription once your endpoint is ready.
Webhook REST subscription.
| event required | string |
| targetUrl required | string |
| userEmail required | string |
{- "event": "staff.create",
- "userEmail": "user@example.com"
}{- "restSubscriptionId": 0,
- "event": "staff.create",
- "userId": 0,
- "organisationId": 0,
- "userEmail": "user@example.com",
- "xHookSecret": "815d6471-2fff-4027-bc9f-45e9ac1ddd2b",
- "whenAdded": 0,
- "whenActivated": 0,
- "whenDeleted": 0
}Updates an existing webhook subscription. The user and organisation IDs are dynamically derived from your authentication token.
| id required | integer <int32> ID of the webhook subscription. |
Webhook REST subscription.
| event required | string |
| targetUrl required | string |
| userEmail required | string |
{- "event": "staff.create",
- "userEmail": "user@example.com"
}{- "restSubscriptionId": 0,
- "event": "staff.create",
- "userId": 0,
- "organisationId": 0,
- "userEmail": "user@example.com",
- "xHookSecret": "815d6471-2fff-4027-bc9f-45e9ac1ddd2b",
- "whenAdded": 0,
- "whenActivated": 0,
- "whenDeleted": 0
}