Skip to content

Webhook events

An outgoing webhook subscribes to a list of events on some or all of your boards. When one happens, Truetask posts a JSON payload to your URL. This page is the full catalog: the events, the fields each one carries, and how a delivery is signed and retried.

Set webhooks up in Settings > Integrations > Webhooks, or from the App menu > Webhooks. See Webhooks for the walkthrough.

Event names keep the API vocabulary

The product calls them tasks. The API and these event names call them cards, so the event stays card.created and the payload field stays card_id.

The envelope

Every delivery has the same four top-level keys.

FieldWhat it is
idDelivery id, unique per delivery and stable across retries.
eventEvent name.
timestampWhen the event happened (ISO 8601, UTC).
dataThe event record (see the fields per event).
json
{
  "id": "k7f2b1c9e3a4d5f6-2r8sn4vtqcx1wla",
  "event": "card.moved",
  "timestamp": "2026-09-22T09:14:03.117000+00:00",
  "data": { "id": "...", "key": "DEVE-412", "title": "...", "...": "..." }
}

Because id is stable across retries, use it to deduplicate. Delivery is at-least-once, so the same id can arrive twice.

Events

Each event has a kind, which decides the base payload fields in data. Events with extra fields add them on top of that kind's fields.

Task events

EventKindWhat it meansExtra fields
card.createdcardA task was created
card.updatedcardA task's title, description, dates, tags or files changedchanges (changed fields with old and new values)
card.deletedcardA task was moved to the trash
card.completedcardA task was completed
card.uncompletedcardA completed task was reopened
card.assignedcardMembers were assigned to a taskassigned, assigned_names
card.unassignedcardMembers were removed from a taskunassigned, unassigned_names
card.movedcardA task moved to another listfrom_list, from_list_name, to_list, to_list_name
card.proposed_donecardAn agent proposed a task as done, for a human to approve or returnrun_id, proposal_event_id, summary, server_check

server_check on a proposal is the list of gaps Truetask found between what the agent claims and the task's real state, as sentences.

Question events

EventKindWhat it means
card.question_askedcard_questionA blocking question was asked on a task
card.question_answeredcard_questionA blocking question was answered or dismissed

Comment and checklist events

EventKindWhat it means
card.comment_addedcommentA comment was posted on a task
comment.deletedcommentA comment was deleted
checklist.completedchecklistA checklist item was ticked
checklist.uncompletedchecklistA checklist item was unticked

List, board and tag events

EventKindWhat it meansExtra fields
list.createdlistA list was added to a board
list.deletedlistA list was deleted
board.member_addedboardMembers joined a boardmembers_added, member_names
board.member_removedboardMembers left a boardmembers_removed, member_names
tag.createdtagA tag was created
tag.deletedtagA tag was deleted

Time events

EventKindWhat it meansExtra fields
time_entry.startedtime_entryA timer started on a task
time_entry.stoppedtime_entryA timer stoppedtimestamp_end, duration (tracked seconds)

Agent events

EventKindWhat it meansExtra fields
agent_run.kickoffagent_kickoffAn agent kickoff reached a runner (first delivery only)kickoff_text
agent_run.handoffagent_runAn agent run was handed to another agentfrom_agent, to_agent, step
agent_run.completedagent_runAn agent run finished
agent_run.failedagent_runAn agent run failed
agent_run.blockedagent_runAn agent run is blocked
agent_run.needs_inputagent_runAn agent asked a question
agent_run.cancelledagent_runAn agent run was cancelled
agent_run.stalledagent_runAn agent run went silent past the watchdog windowstalled_at
agent_run.approvedagent_runA human approved an agent's done proposaldecision, reviewer_id, agent_id, feedback (always empty here)
agent_run.returnedagent_runA human returned an agent's done proposal with feedbackdecision, reviewer_id, agent_id, feedback
agent_kickoff.expiredagent_kickoffNothing picked an agent kickoff up before it expiredattempts, last_error

kickoff_text is the instruction text the runner received. It never contains a secret or a token.

Audit events

EventKindWhat it means
audit.logauditAny audited change on a board

audit.log fires on nearly every record change, so subscribe to it only when you really want the whole stream.

Payload fields by kind

Fields marked (kept) predate the enrichment pass and never change shape, so an old receiver keeps working. Everything else was added so a Zapier, Make or n8n step has the names and links it needs without a second lookup.

card

FieldWhat it is
idTask id (kept)
keyHuman key, e.g. DEVE-123
numberTask number on its board
titleTitle (kept)
urlLink to the task
boardBoard id (kept)
board_nameBoard name
listList id
list_nameList name
completedWhether the task is done (kept)
membersAssignee user ids (kept)
member_namesAssignee names
tagsTag ids (kept)
tag_namesTag names
priorityPriority id or empty
priority_namePriority name or empty
startStart date or empty
dueDue date or empty
description_excerptFirst 280 characters of the description
createdWhen the task was created
updatedWhen the task last changed

comment

FieldWhat it is
comment_idComment id (kept)
messageComment text (Markdown)
senderAuthor user id (kept)
sender_nameAuthor name
card_idTask id (kept)
card_keyTask key
card_titleTask title (kept)
card_urlLink to the task
boardBoard id (kept)
board_nameBoard name

checklist

FieldWhat it is
checklist_idChecklist item id (kept)
contextItem text (kept)
completedWhether the item is ticked (kept)
card_idTask id (kept)
card_keyTask key
card_titleTask title (kept)
card_urlLink to the task
boardBoard id (kept)
board_nameBoard name

list

FieldWhat it is
idList id (kept)
nameList name (kept)
boardBoard id (kept)
board_nameBoard name

tag

FieldWhat it is
idTag id (kept)
nameTag name (kept)
colorTag colour (kept)
boardBoard id (kept)
board_nameBoard name

board

FieldWhat it is
boardBoard id (kept)
board_nameBoard name (kept)

time_entry

FieldWhat it is
time_entry_idTime entry id (kept)
userUser id (kept)
user_nameUser name
timestamp_startWhen the timer started (kept)
card_idTask id (kept)
card_keyTask key
card_titleTask title (kept)
card_urlLink to the task
boardBoard id (kept)
board_nameBoard name

agent_run

FieldWhat it is
run_idAgent run id (kept)
statusRun status (kept)
previous_statusStatus before the change (kept)
agentAgent {id, name} (kept)
summaryRun summary (kept)
card_idTask id (kept)
card_keyTask key
card_titleTask title (kept)
card_urlLink to the task
boardBoard id (kept)
board_nameBoard name

agent_kickoff

FieldWhat it is
kickoff_idAgent kickoff id
statusKickoff status: sent, started, expired, and so on
powerHow it was delivered: wake, desktop or truetask (empty if never delivered)
sourceWhere it came from, e.g. manual, mcp, automation, pipeline or assignment
requested_byUser id that asked for the kickoff, or empty
workflow_idAgent workflow id
agentAgent {id, name}
card_idTask id
card_keyTask key
card_titleTask title
card_urlLink to the task
boardBoard id
board_nameBoard name

card_question

FieldWhat it is
question_idQuestion id
questionThe question
optionsOne-click answer choices (may be empty)
statusopen, answered or dismissed
asked_byUser id that asked (usually an agent)
asked_by_nameName of who asked
answerThe answer text, or the picked option (empty while open)
answer_choiceThe picked option, or empty
answered_byUser id that answered or dismissed, or empty
answered_by_nameName of who answered, or empty
card_idTask id
card_keyTask key
card_titleTask title
card_urlLink to the task
boardBoard id
board_nameBoard name

audit

FieldWhat it is
actorUser id (kept)
actor_nameUser name
actioncreate, update or delete (kept)
entity_typeRecord type (kept)
entity_idRecord id (kept)
entity_nameRecord name (kept)
metaDiff or snapshot (kept)
boardBoard id (kept)
board_nameBoard name

Headers and signing

Every delivery carries these headers.

HeaderValue
Content-Typeapplication/json
User-AgentTruetask-Webhook/1.0
X-Webhook-EventThe event name, the same value as event in the body
X-Truetask-Signaturesha256= plus the HMAC-SHA256 of the raw request body, keyed with your signing secret
X-Webhook-SignatureA plain SHA256 of the body concatenated with the secret. Deprecated, kept for older receivers.

The two signature headers are only sent when the webhook has a signing secret. Verify X-Truetask-Signature, and compare it in constant time:

python
import hashlib, hmac

expected = "sha256=" + hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest()
assert hmac.compare_digest(expected, request.headers["X-Truetask-Signature"])

Sign over the raw bytes you received, before any JSON parsing or re-serialization.

A webhook can also authenticate to your endpoint on top of the signature, with a bearer token, basic auth or a custom header. That is set per webhook under Authentication and is separate from the signing secret.

A secret belongs in the secret field

Never put a credential in the URL or in a custom header you can read back. The signing secret is stored write-only: you can replace it, but nobody can read it again.

Delivery, retries and logs

Deliveries go out off the request path, so a slow or dead endpoint never blocks the person who triggered the event.

  • Truetask sends POST by default; a webhook can be set to PUT or PATCH instead.
  • Each attempt has a 10 second timeout, and redirects are never followed.
  • Any 2xx response counts as delivered.
  • A 4xx response is permanent: Truetask logs it and gives up, because a retry would be rejected the same way.
  • A 5xx response, a timeout or a connection failure is retried up to 5 attempts, waiting 60 seconds, then 120, then 300, then 1800 seconds between them.

Every attempt writes a row you can read under Recent deliveries on the webhook, with the status code, the body Truetask sent and the answer it got back.

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