SIAPP API for Zapier
This is the API the SIAPP Zapier integration uses. You can also call it from your own scripts. All endpoints are read-only, except Create task.
- Base URL:
https://api.siapp.cc - Format: JSON (UTF-8). Times are ISO 8601 in UTC, for example
2026-09-30T09:15:00.000Z. - Plans: the API works on every SIAPP plan. Tasks need a plan that includes Tasks (Professional or Enterprise).
Authentication
Every request needs your personal API key in the X-API-Key header:
X-API-Key: siapp_0123456789abcdef0123456789abcdef01234567
- Create a key in SIAPP at siapp.cc/profile → Integrations → Zapier. You see the key only once, so store it somewhere safe.
- Each account has one key at a time. Creating a new key replaces the old one straight away, and revoking a key stops it working at once.
- Keys are accepted only in the header. A key in a URL or query string is rejected.
- The key has the same access you have in the app. That covers your own projects and any team projects where you are an active member.
Rate limits
- 120 requests per minute per API key.
- 30 report PDF downloads per hour per API key.
If you go over a limit, you get 429 Too Many Requests with standard RateLimit-* headers.
Errors
Errors return a JSON body with a readable message:
{ "success": false, "message": "Task management is not available in the Free plan. Upgrade to Professional to create, assign, and track tasks." }
| Status | Meaning |
|---|---|
| 400 | Invalid input. message lists the problems. |
| 401 | Missing, malformed, revoked or unknown API key (code: INVALID_API_KEY). |
| 403 | Your plan or project role does not allow this. Also returned for a suspended account (code: ACCOUNT_SUSPENDED). |
| 404 | The project, photo or report was not found, or you cannot access it. |
| 429 | Rate limit reached. |
| 500 | Server error. Try again later. |
Account
GET /api/zapier/me
Returns the owner of the key. Zapier uses it to test the connection.
{ "id": "64f0c0ffee0000000000abcd", "email": "[email protected]", "name": "Alex Inspector" }
GET /api/zapier/projects
Lists every project you can access, sorted by name.
[
{ "id": "proj_1727000000000", "name": "Riverside Office" },
{ "id": "proj_1727100000000", "name": "Harbour Warehouse" }
]
Polling feeds
Each feed returns a JSON array of the 50 newest items, newest first. Every item has
a unique, stable id and a createdAt time.
All feeds take an optional ?projectId= query parameter that limits results to one project.
GET /api/zapier/triggers/photos
Photos added to your projects.
[
{
"id": "photo_1727700000000_3f9a2c1b7e",
"createdAt": "2026-09-30T09:15:00.000Z",
"projectId": "proj_1727000000000",
"projectName": "Riverside Office",
"category": "issue",
"notes": "Crack in plaster above door, level 2 corridor",
"description": "Crack in plaster above door, level 2 corridor",
"tags": [],
"layoutId": "layout_R3JvdW5kRmxvb3IucG5n",
"layoutName": "Level 2",
"pinId": "pin_1727700000000_a1b2c3d4e5",
"uploadedBy": "[email protected]",
"photoUrl": "https://api.siapp.cc/api/zapier/photos/photo_1727700000000_3f9a2c1b7e/file"
}
]
category is one of general, progress, issue, inspection or task.
layoutName and pinId are only filled in when the photo is pinned to a floor plan.
GET /api/zapier/triggers/reports
Reports you have generated.
[
{
"id": "report_1727700000000_k3j9x",
"createdAt": "2026-09-30T17:00:00.000Z",
"projectId": "proj_1727000000000",
"projectName": "Riverside Office",
"title": "Progress Report (30/09/2026)",
"type": "progress",
"status": "completed",
"category": "all",
"photoCount": 24,
"pdfUrl": "https://api.siapp.cc/api/zapier/reports/report_1727700000000_k3j9x/pdf"
}
]
pdfUrl can be null for very old reports that have no valid report id.
GET /api/zapier/triggers/tasks
Tasks in your projects. This needs a plan that includes Tasks.
[
{
"id": "task_1727700000000_x8k2m1q9z",
"createdAt": "2026-09-30T10:00:00.000Z",
"projectId": "proj_1727000000000",
"projectName": "Riverside Office",
"title": "Repair plaster crack",
"description": "Level 2 corridor, above door 2.14",
"status": "open",
"priority": "high",
"assignee": "Sarah Chen",
"assignees": [{ "id": "64f0c0ffee0000000000abcd", "name": "Sarah Chen", "email": "[email protected]" }],
"dueDate": "2026-10-07T00:00:00.000Z",
"createdBy": "[email protected]"
}
]
Files
photoUrl and pdfUrl contain no credentials. They work only when the request also
sends the X-API-Key header, so a copied link does not expose your files. The Zapier
integration downloads each file with your key and passes it to later Zap steps as a
file. Zapier hosts that copy.
GET /api/zapier/photos/{photoId}/file
Returns the original photo bytes, with the photo's content type.
GET /api/zapier/reports/{reportId}/pdf
Returns the report as a PDF. If the PDF has not been created yet, SIAPP creates it on the first request, which can take a few seconds.
Actions
POST /api/zapier/actions/tasks
Creates a task in a project. This needs a plan that includes Tasks. You also need a project role that can create tasks: owner, admin or member, but not viewer.
Request body:
| Field | Type | Required | Notes |
|---|---|---|---|
projectId |
string | yes | From GET /api/zapier/projects |
title |
string | yes | 1–200 characters |
description |
string | no | Up to 2000 characters |
dueDate |
string | no | ISO 8601 date or date-time, for example 2026-10-15 |
priority |
string | no | low, medium (default), high or urgent |
curl -X POST https://api.siapp.cc/api/zapier/actions/tasks \
-H "X-API-Key: $SIAPP_API_KEY" \
-H "Content-Type: application/json" \
-d '{"projectId":"proj_1727000000000","title":"Repair plaster crack","dueDate":"2026-10-07"}'
Response 201 Created returns the new task in the same shape as the tasks feed. New
tasks start with status open.
Managing your key (signed in to SIAPP)
These endpoints use your normal SIAPP login (Authorization: Bearer <token>), not the API key.
siapp.cc uses them on the Integrations page.
| Method | Path | Result |
|---|---|---|
GET |
/api/integrations/zapier/key |
{ success, data: { hasKey, prefix, createdAt, lastUsedAt } } |
POST |
/api/integrations/zapier/key |
Creates or replaces the key: { success, data: { key, prefix, createdAt } }. This is the only time the full key is shown. |
DELETE |
/api/integrations/zapier/key |
Revokes the key. |
lastUsedAt updates at most once a minute.