Skip to content

Webhooks

Webhooks let you subscribe to TruePPM project events and receive an HTTP POST to a URL you control when those events occur. Common uses: posting notifications to Slack, triggering a CI pipeline when a milestone is resolved, or syncing changes to an external system.

Webhooks are scoped to a project. Register one via the API or (once the Integrations UI lands) from the project settings page.

POST /api/v1/projects/{project_id}/webhooks/
Content-Type: application/json
{
"url": "https://hooks.example.com/trueppm",
"secret": "your-shared-secret",
"events": ["task.created", "task.updated", "schedule.recalculated"]
}

events is an array of one or more event type strings (see below). Omit events to subscribe to all event types.

Permissions: requires Admin role (role ≥ 4) on the project.

EventWhen fired
task.createdA task is created
task.updatedA task field is changed
task.deletedA task is deleted
dependency.createdA task link (FS/SS/FF/SF) is created
dependency.deletedA task link is deleted
schedule.recalculatedThe CPM scheduler completes a recalculation
project.createdA new project is created in the organization

Every delivery sends a JSON body:

{
"event": "task.updated",
"project_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"timestamp": "2026-05-11T14:30:00Z",
"data": { ... }
}

data contains the serialized resource that changed. For task events this is the full task object as returned by GET /api/v1/tasks/{id}/.

Every request includes an X-TruePPM-Signature header:

X-TruePPM-Signature: sha256=<hmac>

The HMAC is HMAC-SHA256(secret, raw_body) where secret is the value you supplied at registration and raw_body is the raw request bytes.

Example verification in Python:

import hashlib, hmac
def verify(secret: str, body: bytes, signature: str) -> bool:
expected = "sha256=" + hmac.new(
secret.encode(), body, hashlib.sha256
).hexdigest()
return hmac.compare_digest(expected, signature)

Always use a constant-time comparison to prevent timing attacks.

TruePPM retries failed deliveries (non-2xx response or connection error) up to 3 times with exponential back-off (10s, 60s, 300s). After 3 failures the delivery record is marked failed.

GET /api/v1/projects/{project_id}/webhooks/{webhook_id}/deliveries/

Returns paginated WebhookDelivery records with status, response_status, attempt_count, and timestamps. Useful for debugging.

Set is_active: false via PATCH to pause deliveries without deleting the registration:

PATCH /api/v1/projects/{project_id}/webhooks/{webhook_id}/
{"is_active": false}
ActionMinimum role
List / view webhooksViewer
Create / update / delete webhooksAdmin