About
A task is one actionable line item — a follow-up call, a document to chase, a step in an onboarding SOP. It has a title, an optional description, a due date, and assignees, and it gets checked off when the work is done. Two things a task is not:- A calendar event. Something with a start time and attendees is an appointment — see the Appointments API.
- A background job. The async jobs that ops like
addContactTagsreturn abulkTaskIdfor live under the Bulk Tasks API, and are unrelated to the CRM tasks on this page.
applyTaskTemplate or
applyTaskSet in the Workflows API.
These apply reusable templates to a contact; applyTaskSet can report a
partial result, so inspect its failedStep before reporting completion.
All operations go through the developer API gateway — one endpoint, called by
operationId. If you haven’t set up a key yet, start with the
Developer API Overview.
Operations
Reading tasks (READ scope)
When
users.getUserTasks.canFetchNext is true, call listMyTasks again with
the same filters and cursor set to the last task’s id. Repeat until false.
Pagination is forward-only; start again without a cursor to revisit earlier
rows. OVERDUE means before today in the supplied timezone. To find tasks
past due at this instant, use completed: false and dueBefore instead.
What
listMyTasks returns depends on the key’s roleWithout a participants filter, every role gets the key owner’s own queue.
A MEMBER or ISA key stays limited to that queue even when other
participants are supplied. A team-admin key can request teammates’ queues
by passing their user ids in participants (from listTeammates), but the
results still include only tasks on contacts the key owner can access.
Neither form includes unassigned tasks or guarantees a complete org backlog.Writing tasks (WRITE scope)
Which complete operation to use
listMyTasks tells you: if a task comes back with contact: null, there is no
contactId to pass and completeTask cannot touch it — use completeTaskById.
If it has a contact, use completeTask, which records the completion on that
contact’s timeline as well. completeTaskById refuses a task that has a
contact, so an error there means you want the other operation.Due dates are a local day, not an instant
timezone (PST, MST, CST, EST, …) is the zone the due date’s day is
read in, and it decides which TODAY / OVERDUE bucket the task lands in.
Send the user’s own zone, and for a day-level request (“follow up Friday”)
pick an end-of-business time in that zone rather than a bare midnight.No bulk create, and no re-anchoringThere is no multi-task call: a checklist is built by calling
createTaskOnContact once per step, in order, with staggered due dates. The
response echoes the contact’s full task list every time, so the last call
confirms the whole set landed.A task also cannot be moved to a different contact. contactId on updateTask
identifies the task’s existing contact — any other contact is rejected.
Delete-and-recreate is not equivalent: a fresh task loses the original’s
completedAt history, created date, and notification links.Organization guardEvery id you pass is org-guarded before the operation runs:
taskId (via its
linked contact, or via an in-org participant for a contact-less task),
contactId, dealId/dealIds, and participants user ids. The write
operations additionally bind the pair — a foreign task id can never be
completed or edited under a contact you do own, and vice versa. See
Authorization for the model.