---
title: "Update a task"
method: PUT
path: "/v3/tasks/{id}"
tags: ["Tasks"]
---

# Update a task

`PUT /v3/tasks/{id}`

<small>_Requires the `tasks:write` scope (or a broader one that includes it)._</small>

Full replacement update of a task. Only tasks with status `New` (0) can be updated.
Sequence task type and contact cannot be changed.

## Path parameters

- `id` integer, required

## Request body

- object — Request body for updating a task. Full replacement (PUT), not partial update.
  - `taskType` 'toDo' | 'call' | 'meeting' | 'linkedIn' | 'manualEmail' | 'sms' | 'whatsApp', required — Task type. Possible values: `toDo`, `call`, `meeting`, `linkedIn`, `manualEmail`, `sms`, `whatsApp`.
  - `startAt` string, date-time, required — Task start time. Must be on or after 2015-01-01.
  - `dueTo` string, date-time, required — Task due time. Must be after startAt.
  - `contactId` integer, nullable — Contact (prospect) ID. Cannot be changed for sequence-created tasks.
  - `linkedInTaskType` 'message' | 'connect' | 'inMail' | 'viewProfile', nullable — LinkedIn action subtype. Only for LinkedIn tasks. Possible values: `message`, `connect`, `inMail`, `viewProfile`.
  - `template` object, required — Updated task content template. Body is required.
    - `body` string — Template body text. May contain `{{variable}}` placeholders for sequence tasks.
    - `subject` string, nullable — Email subject or LinkedIn message subject. Null for non-email/LinkedIn task types.
    - `attachmentIdList` integer[], nullable — Read-only. Attachment IDs for ManualEmail tasks (set by sequence system, not user-editable via API).

## Response `200`

Task updated successfully.

- object — Full task detail returned by GET by ID, Create, and Update endpoints.
  - `id` integer — Task ID.
  - `contactId` integer, nullable — Associated contact (prospect) ID.
  - `taskType` 'toDo' | 'call' | 'meeting' | 'linkedIn' | 'manualEmail' | 'sms' | 'whatsApp' — Task type. Possible values: `toDo`, `call`, `meeting`, `linkedIn`, `manualEmail`, `sms`, `whatsApp`.
  - `status` 'new' | 'finished' | 'cancelled' | 'archived' | 'sequenceDetached' — Task status. Possible values: `new`, `finished`, `cancelled`, `archived`, `sequenceDetached`.
  - `linkedInTaskType` 'message' | 'connect' | 'inMail' | 'viewProfile', nullable — LinkedIn action subtype. Only present for LinkedIn tasks. Possible values: `message`, `connect`, `inMail`, `viewProfile`.
  - `sequenceId` integer, nullable — Sequence ID if this task was created by a sequence.
  - `sequenceStepId` integer, nullable — Sequence step ID. Available when the ExtendedFilterInTasks feature is enabled.
  - `sequenceStepDisplayName` string, nullable — Human-readable sequence step name (e.g. "Step 2 - Email").
  - `assignedUserId` integer — ID of the user this task is assigned to.
  - `creationSource` 'user' | 'sequence' | 'meeting' — How the task was created. Possible values: `user`, `sequence`, `meeting`.
  - `createdAt` string, date-time — When the task was created.
  - `startAt` string, date-time — Task start time. When `isScheduled` is true, this is the scheduled execution time.
  - `dueTo` string, date-time — Task due time.
  - `finishedAt` string, date-time, nullable — When the task was completed. Null for active tasks.
  - `isFailed` boolean — Whether the task execution failed.
  - `isScheduled` boolean — Whether the task is scheduled for automatic execution.
  - `template` object — Raw task template. For active tasks, may contain `{{variable}}` placeholders. For finished tasks, contains the final content (raw version is no longer available).
    - `body` string — Template body text. May contain `{{variable}}` placeholders for sequence tasks.
    - `subject` string, nullable — Email subject or LinkedIn message subject. Null for non-email/LinkedIn task types.
    - `attachmentIdList` integer[], nullable — Read-only. Attachment IDs for ManualEmail tasks (set by sequence system, not user-editable via API).
  - `content` object, nullable — Rendered task content with all variables resolved. Returned only when `includeContent=true` is requested on GET by ID. Also used as input for the execute endpoint — the final text to send.
    - `body` string — Rendered body text with all variables resolved.
    - `subject` string, nullable — Rendered subject for ManualEmail/LinkedIn tasks.
  - `deliveryInfo` object, nullable — Delivery target information. Only one field is populated depending on task type. For active tasks, sourced from the prospect record. For finished ManualEmail tasks, sourced from the sent email.
    - `email` string, nullable — Recipient email address (ManualEmail tasks).
    - `phoneNumber` string, nullable — Recipient phone number (Call and SMS tasks).
    - `linkedInUrl` string, nullable — Prospect's LinkedIn profile URL (LinkedIn tasks).

## Other responses

- `400` — Validation failure on the request body or route parameter (missing/unparseable body, invalid field values, `id` not a positive integer). Domain rule rejections (`canOnlyEditNewTasks`, `cannotChangeSequenceTaskType`, `cannotChangeSequenceTaskContact`, `invalidDates`, `renderError`) also surface here at 400 via the fallback `task.unknown` code.
- `401` — Unauthorized. The response body is empty; check the `WWW-Authenticate` header for the expected scheme.
- `403` — User lacks required feature scope to update this task
- `404` — Task does not exist, or the caller does not have permission to edit it.
- `429` — Too Many Requests

---

[API](https://skmtc.net/reply/apis/reply-api.md) · [All operations](https://skmtc.net/reply/apis/reply-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/reply/reply-api/revisions/1c3d32eaf95e/schema)
