Skip to content
Developers

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.