Skip to content

Webhooks

Webhooks run in two directions. Outgoing subscriptions deliver Truetask events to a URL you own, and incoming endpoints give another system a URL it can call to start an automation here.

Both live in one place. Open the App menu (the grid button before your avatar) and choose Webhooks, or go to Settings > Integrations > Webhooks. The view opens on Incoming and has an Outgoing tab beside it.

Truetask Webhooks dialog with Incoming and Outgoing tabs

Truetask Cloud only

Saved webhooks, in either direction, need a paid plan on Truetask Cloud. See Plans and billing.

Outgoing webhooks

Creating a subscription

Switch to Outgoing and click New webhook.

FieldWhat it does
NameWhat the row is called in the list
Endpoint URLWhere deliveries go, with a method picker for POST, PUT or PATCH
Signing secretThe shared secret deliveries are signed with, with a button that generates a random one
EventsThe events to subscribe to, grouped, with Select all and Select none
BoardsWhich boards' events to receive; leave it empty for every board
AuthenticationHow Truetask authenticates to your receiver: None, Bearer token, Basic auth or Header

The signing secret and the authentication credentials are write-only. Once saved they are never shown again, and leaving the field blank on an edit keeps the stored value.

The API also accepts a headers object for extra static headers; first-class authentication wins over a header of the same name.

Who can subscribe to what

Workspace owners and admins can subscribe to any boards, or leave Boards empty to receive the whole workspace. Anyone else must name at least one board they belong to.

Membership is checked again at delivery time, not just at save time. A subscription created by a member stops receiving a board's events the moment they leave that board.

Owners and admins see every subscription in the workspace, each labelled with who created it. Everyone else sees only their own.

The delivery

Every delivery is a JSON body with the same envelope:

json
{
  "id": "5g2k9h1m3n8p7q4r-w1e2r3t4y5u6i7o8",
  "event": "card.completed",
  "timestamp": "2026-09-10T16:20:22.801Z",
  "data": { }
}

id is the delivery id, unique per delivery and identical on every retry, so a deduplication step can key on it safely. timestamp is when the event happened, ISO 8601 in UTC. data is the record the event describes, and the event name also travels in an X-Webhook-Event header.

data is enriched before it goes out, so a receiver does not have to call back for names. A task event carries the human key, a link to the task, board and list names, member and tag names, priority name, start and due dates and a description excerpt beside the raw ids. A comment, checklist or timer event carries the task key, title and link as well as the ids. Agent events carry the agent as {id, name}, the run status and the task it belongs to.

The signature

When a subscription has a signing secret, every delivery carries:

X-Truetask-Signature: sha256=<hex HMAC-SHA256 of the raw body, keyed with the secret>

Verify against the raw bytes you received, before parsing, and compare in constant time.

A second header, X-Webhook-Signature, carries a plain SHA-256 of the body concatenated with the secret. It is the legacy scheme, kept only for receivers written before the HMAC header existed. Verify X-Truetask-Signature in anything new.

Delivery, retries and logs

Deliveries do not run on the request that caused them. Events are queued and drained in the background, so a slow receiver never slows the app down.

A delivery is retried only when the failure looks transient: a timeout, a connection error, or a 5xx from your receiver. Up to five attempts are made, spaced roughly 60 seconds, then 2 minutes, then 5 minutes, then 30 minutes apart. A 4xx is treated as your receiver rejecting the request, which a retry would only repeat, so it is logged once and dropped. Each attempt has a 10 second timeout.

Expand a row in the list to see its subscribed events and its last delivery attempts with the event, status code and time. GET /v1/webhooks/{id}/logs returns the same 25 attempts with the exact body that was sent and the first part of your receiver's answer. The mark on the row itself is the last delivery's outcome, so a failing subscription is visible without opening it.

Testing

The paper plane button on a row sends a webhook.test payload through the saved subscription, credentials, signature and all, and logs the attempt like a real delivery.

Two API routes help an automation platform set itself up:

  • POST /v1/webhooks/{id}/sample finds the newest real record for one of the subscription's events and delivers it about a second later, as a genuine delivery in the live shape. This is how a "listen for a test event" step gets real data without waiting for something to happen. It answers 404 when the workspace has no such record yet.
  • GET /v1/webhooks/samples?event=<name> returns recent items in the delivery shape without sending anything.

GET /v1/webhooks/events lists every event with its summary and the fields its data carries.

Which URLs are allowed

A webhook URL must start with http:// or https:// and must not contain a # fragment. The fragment rule catches a common copy and paste mistake: some receiver services show a browser dashboard URL with a fragment and the real receiver URL at the top of the page.

A URL that resolves to localhost, an internal name or a private address is refused when you save it, where you can read why, rather than failing silently at every delivery. Deliveries never follow redirects.

Self-hosted only

An instance that genuinely posts to your own intranet can allow it with Allow private network targets in Settings > General > Network. See Network.

The event catalog

There are 35 events, in these families:

FamilyEvents
Taskscreated, updated, deleted, completed, reopened, assigned, unassigned, moved
Commentscomment added, comment deleted
Checklistsitem completed, item uncompleted
Listscreated, deleted
Board membersadded, removed
Tagscreated, deleted
Timersstarted, stopped
Questionsquestion asked, question answered
Agentskickoff delivered, kickoff expired, handoff, needs input, blocked, stalled, done proposed, approved, returned, completed, failed, cancelled
Auditaudit log entry

Every event name and every payload field is listed in Webhook events.

Incoming endpoints

An incoming endpoint is a URL you hand to an outside system. When it posts, Truetask starts the automations subscribed to that endpoint.

Creating an endpoint

Only workspace owners and admins can create one. On the Incoming tab click New endpoint.

FieldWhat it does
NameWhat the row is called, and the actor name a run is attributed to
AuthenticationNone, a Header name and value, or Basic username and password
MethodsThe HTTP verbs the URL accepts; a new endpoint is POST-only
BoardsWhich boards may subscribe to it; leave it empty to let every board subscribe
Accept filesWhether the endpoint also takes multipart/form-data, and how many files a request may carry

An endpoint belongs to the workspace, not to a board. Boards is an allowlist of who may subscribe, so deleting a board never deletes the endpoint.

Anyone with the URL can trigger it

The URL is the only thing standing between the internet and your automations. Add a header or basic secret whenever the sender can send one.

The URL

The endpoint's URL is <workspace>/v1/hooks/<random path>. Copy it from the row with Copy URL.

Regenerate URL mints a new path. The old URL stops working immediately, so update every sender before you do it.

Using it in an automation

On a board, open the Automations view and add an Incoming webhook trigger. Pick the endpoint from the list: it offers the endpoints whose allowlist permits this board, and marks a paused one. A workspace owner or admin also gets a New endpoint button right there. Anyone else with no endpoint available is told to ask a workspace admin to make one.

Everything the request carried is then available to the steps after the trigger:

PlaceholderWhat it holds
{webhook.name}The endpoint name
{webhook.method}The HTTP method used
{webhook.body}The raw body
{webhook.body.<field>}One field of a JSON or form body
{webhook.query.<param>}One query string parameter
{webhook.header.<name>}One request header
{webhook.ip}The sender's IP
{webhook.files}, {webhook.files_count}The names and the count of the files the request carried

Only a short list of request headers is kept and exposed (content-type, user-agent, x-request-id, x-delivery-id), so an authentication header can never leak into a log or a placeholder.

The trigger's configuration panel shows the last request it received, so you can copy a placeholder straight from a real payload instead of guessing field names.

Testing an endpoint

The row's Send a request panel shows a ready example to copy, and, when the endpoint accepts GET, a Test in browser link. Values after the ? in the URL arrive as query fields the automation can read.

POST /v1/webhooks/incoming/{id}/trigger fires an endpoint as the signed-in caller, with no public URL and no external credential. Owners and admins may call it for any endpoint; anyone else must be a member of a board the endpoint allows. This is how the n8n node starts a Truetask workflow.

Request log and limits

Recent requests lists what arrived, with the outcome of each: Accepted, Auth failed, Method not allowed, Unsupported body, Too large, Rate limited, Files refused or Paused. The log records the body, never file bytes.

LimitValue
Requests per minute, per endpoint and sender120
Body size1 MB, or 25 MB for an endpoint that accepts files
Files per request5 by default, up to 20

The endpoint always answers fast and runs the subscribed automations afterwards, so a sender is never left waiting on your workflow. An accepted request answers 202 even when nothing is listening yet.

Signing secrets

Signing secrets are the other half of the picture: keys Truetask uses to sign calls it makes out to a runner or a gateway, so the receiver can prove the call came from your workspace. They are used by an agent workflow step's launch URL and by an automation's HTTP request node.

A secret is write-only by construction: it is encrypted at rest, and you can create, replace and delete one, but nobody can read it back, including the person who set it. Steps and nodes store the secret's id, never its value, which is why an id is safe to leave in workflow JSON that every board member can read.

When a call is signed, the receiver gets:

X-Webhook-Timestamp: <unix seconds>
X-Webhook-Signature-V2: <hex HMAC-SHA256 of "<timestamp>.<raw body>", keyed with the secret>

The HTTP request node extends the same idea to plain credentials: put {secret.<id>} in a header value and the id is what gets stored, with the value resolved at send time. Never put a secret in a URL or in a header you typed literally, because both are readable by anyone who can open the automation.

Truetask works the same on Truetask Cloud and on your own server. Pages and sections that apply to one model only are labelled.