Resources

Tasks

A task is a to-do or action item attached to your CRM records. A task is a record, so you create, read, update, and delete it with the same /api/v1/objects/task/records routes as any other object - the full request and response shapes are under Records. This page covers what is specific to tasks: the fields a task carries, the rules the API enforces, how to mark one done, and the one task-only endpoint, reassignment.

The task model

A task carries a short title, an optional description, a status and priority, some dates, an owner, and links to the records it is about. Only title is required. The fields you will set are below; the rest of a task's fields are filled in by the product (for example by the AI assistants) and are read-only through the API.

Fields you can set

title string · requiredShort summary of the task. The only required field.
description stringLonger detail about what needs doing.
status enumOne of Open, Pending, Done, Recommended. Defaults to Open.
priority enumOne of High, Medium, Low. Defaults to High.
due_at datetimeWhen the task is due (ISO 8601, e.g. 2026-10-20T17:00:00Z). Defaults to a date set by the product if you omit it.
reminder_at datetimeWhen to remind the owner.
completed_at datetimeWhen the task was finished. Must be now or in the past. Not set automatically on this API - see Complete a task.
owner_id user idThe user responsible for the task ("Assign To"). Omit it and the task is assigned to you. Changing it later is a reassignment, not an edit - see Reassign a task.
contact_ids, company_ids, deal_ids id arraysThe records the task is about. Set these inside properties. At least one is required (see below).
meeting_id idA single meeting the task is for.

A task must be linked to at least one record

Every task you create names at least one contact, company, or deal in properties. A task with only a title is rejected with "A task needs at least one contact, company or deal." An edit may change which records are linked, but it may not remove the last one.

Linked records must share one company

Everything a task is linked to has to roll up to the same company. If you link a contact and a deal that belong to different companies, the task is refused and the message names the mismatch, for example: "The records on a task must share one company: deal 1032672 belongs to company [1031396] and contact 1026842 belongs to company [1005738]". The same check runs when you add records on an edit.

System-managed fields

Fields like task_source, task_type, confidence, and the ranking fields are owned by the product and can't be set through the API. A task you create over the API is always stamped task_source: "USER" and task_type: "USER_TASK".

Standard record operations

Because a task is a record, you create, read, update, delete, and list tasks with the same object routes as a contact, company, or deal - only the object type in the path changes to task. The request and response shapes are the ones documented under Records.

ActionRequest
Create a taskPOST /api/v1/objects/task/records · Create a record
Retrieve a taskGET /api/v1/objects/task/records/{id} · Retrieve a record
Edit a taskPATCH /api/v1/objects/task/records/{id} · Edit a task
Delete a taskDELETE /api/v1/objects/task/records/{id} · Delete a task
List tasksGET /api/v1/objects/task/records · List records

Four of these have a rule that applies only to tasks, so they are worked through below. Creating a task has to link it to a record. Editing and completing leave the task's links and owner as they are. Deleting removes it for good. All four follow the access rule in the note below. Retrieve and list behave exactly as they do for any record.

You can only act on a task you have access to

To edit, complete or delete a task, you need access to it, which normally means you own it. Dreamteam checks this the same way it checks any other record. It makes no difference who created the task: one Sally made is not protected any differently, and it gives you no rights over a task that belongs to someone else. Try to edit, complete or delete another person's task and you get 403 with the body {"message": "Access denied"}. It is the same rule you see in the app, where Mark as done, dismiss and delete simply do not appear on a task that is not yours. Workspace admins can act on any task.

Create a task

POST /api/v1/objects/task/records

This is the standard record create (see Create a record), applied to the task type with the task rules above. Pass title plus at least one linked record in properties. Omit owner_id to assign the task to yourself. The records you link appear under the task's associations, not in properties - retrieve the task with ?associations=contact to read them back.

Request body

properties object · requiredThe task's fields. Must include title and at least one of contact_ids, company_ids, or deal_ids.

Returns

201 Created with the new task, including its id and the task_source / task_type the server stamped.

Errors

400 VALIDATION_FAILEDNo linked record ("A task needs at least one contact, company or deal."), linked records on different companies, or an owner_id that can't take a task ("That person cannot take a task").
POST /api/v1/objects/task/records
curl 'https://api.dreamteamcrm.ai/api/v1/objects/task/records' \
  -X POST \
  -H 'Authorization: Bearer <YOUR_TOKEN>' \
  -H 'Content-Type: application/json' \
  -d '{
    "properties": {
      "title": "Follow up with Ada about the renewal",
      "description": "Send the updated quote and confirm the renewal date.",
      "priority": "High",
      "due_at": "2026-10-20T17:00:00Z",
      "contact_ids": [1015634]
    }
  }'
{
  "id": 1044516,
  "type": "task",
  "properties": {
    "task_source": "USER",
    "owner_id": 1000052,
    "description": "Send the updated quote and confirm the renewal date.",
    "due_at": "2026-10-20T17:00:00Z",
    "title": "Follow up with Ada about the renewal",
    "priority": "High",
    "task_type": "USER_TASK",
    "status": "Open"
  },
  "created_at": "2026-10-15T09:58:49.930855783Z",
  "updated_at": "2026-10-15T09:58:49.930855783Z",
  "created_by": 1000052
}
Task created.

Edit a task

PATCH /api/v1/objects/task/records/{id}

Send only the fields you want to change. Anything you leave out keeps the value it already had, and sending a field as null clears it. Set the Content-Type header to application/merge-patch+json. This is the standard record update (see Update a record) applied to a task. The example below moves the due date and lowers the priority.

What an edit can and can't touch

You can edit a task only if you have access to it, which normally means you own it. Editing someone else's task returns 403. An edit also keeps the task's own rules: it stays linked to at least one record, and everything it links to stays on one company. It cannot change the owner. Handing a task to someone else is a reassignment, not an edit. Marking a task done is an edit too, but a specific one, covered next.

Request body

properties object · requiredThe task fields to change. Editable fields include title, description, priority (High, Medium, Low), due_at, reminder_at, and status.

Returns

200 OK with the full task, reflecting the changed fields.

PATCH /api/v1/objects/task/records/{id}
curl 'https://api.dreamteamcrm.ai/api/v1/objects/task/records/1044516' \
  -X PATCH \
  -H 'Authorization: Bearer <YOUR_TOKEN>' \
  -H 'Content-Type: application/merge-patch+json' \
  -d '{
    "properties": {
      "title": "Follow up with Ada about the renewal (revised)",
      "due_at": "2026-10-22T17:00:00Z",
      "priority": "Medium"
    }
  }'
{
  "id": 1044516,
  "type": "task",
  "properties": {
    "task_source": "USER",
    "owner_id": 1000052,
    "description": "Send the updated quote and confirm the renewal date.",
    "due_at": "2026-10-22T17:00:00Z",
    "title": "Follow up with Ada about the renewal (revised)",
    "priority": "Medium",
    "task_type": "USER_TASK",
    "status": "Open"
  },
  "created_at": "2026-10-15T09:58:49.930856Z",
  "updated_at": "2026-10-16T05:20:11.482301746Z",
  "created_by": 1000052
}
Task rescheduled and re-prioritised. Still open - completing it is the next step.

Complete a task

PATCH /api/v1/objects/task/records/{id}

Marking a task done is an edit that sets status to Done (see Update a record). There is no separate "complete" endpoint. Because it is an edit, the access rule applies. You can complete a task only if you have access to it, and completing someone else's returns 403.

completed_at is not filled in for you

Setting status: "Done" over this API does not stamp completed_at (it comes back absent). If you want that timestamp recorded, set it in the same request. It must be now or in the past, for example "completed_at": "2026-10-16T05:30:00Z".

Returns

The task with status: "Done".

PATCH /api/v1/objects/task/records/{id}
curl 'https://api.dreamteamcrm.ai/api/v1/objects/task/records/1044516' \
  -X PATCH \
  -H 'Authorization: Bearer <YOUR_TOKEN>' \
  -H 'Content-Type: application/merge-patch+json' \
  -d '{
    "properties": {
      "status": "Done"
    }
  }'
{
  "id": 1044516,
  "type": "task",
  "properties": {
    "task_source": "USER",
    "owner_id": 1000052,
    "meeting_id": null,
    "description": "Send the updated quote and confirm the renewal date.",
    "due_at": "2026-10-22T17:00:00Z",
    "title": "Follow up with Ada about the renewal (revised)",
    "priority": "Medium",
    "task_type": "USER_TASK",
    "status": "Done"
  },
  "created_at": "2026-10-15T09:58:49.930856Z",
  "updated_at": "2026-10-16T05:26:34.442992819Z",
  "created_by": 1000052
}
Task marked done.

Delete a task

DELETE /api/v1/objects/task/records/{id}

Deletes a task. This is the standard record delete (see Delete a record) applied to a task. The delete is permanent: there is no undo and no trash.

You can delete only your own task

Deleting follows the access rule. You can delete a task you have access to, and deleting someone else's task returns 403, no matter who or what created it. Workspace admins can delete any task.

Returns

204 No Content with an empty body. There is no JSON to parse, so check the status code. You also get 204 if no task with that id exists, so repeating a delete you have access to is safe.

Errors

403 FORBIDDENThe task belongs to someone else, or you do not have delete access to it. The body is {"message": "Access denied"}. It does not say which of the two, on purpose.
DELETE /api/v1/objects/task/records/{id}
curl 'https://api.dreamteamcrm.ai/api/v1/objects/task/records/1044516' \
  -X DELETE \
  -H 'Authorization: Bearer <YOUR_TOKEN>'
# 204 No Content
# Task deleted - empty body, so check the status code.
# You also get 204 if no task with that id exists.
Task deleted - no content returned.

Find eligible assignees

GET /api/v1/sally/tasks/{id}/reassign-targets

Returns the colleagues a task can be handed to: activated teammates who can see every record the task is linked to. Use it to pick a valid newOwnerId before reassigning. The response is a plain array of users (not the paginated results / metadata shape).

Path parameters

id integer · requiredNumeric identifier of the task.
GET /api/v1/sally/tasks/{id}/reassign-targets
curl 'https://api.dreamteamcrm.ai/api/v1/sally/tasks/1044516/reassign-targets' \
  -H 'Authorization: Bearer <YOUR_TOKEN>'
[
  {
    "id": 1000045,
    "first_name": "Sam",
    "last_name": "Okafor",
    "primary_email": "sam.okafor@example.com",
    "username": "sam.okafor@example.com",
    "role": "sales_member",
    "title": "Account Executive",
    "status": "ACTIVATED",
    "sales_user": true,
    "created_at": "2026-05-22T08:38:24.479589Z"
  },
  {
    "id": 1000061,
    "first_name": "Priya",
    "last_name": "Nair",
    "primary_email": "priya.nair@example.com",
    "username": "priya.nair@example.com",
    "role": "sales_member",
    "title": "Account Executive",
    "status": "ACTIVATED",
    "sales_user": true,
    "created_at": "2026-08-05T09:05:15.533764Z"
  }
]
The colleagues this task can be handed to.

Reassign a task

PATCH /api/v1/sally/tasks/{id}/reassign

Hands a task to another rep. This is the only way to change a task's owner - a plain edit won't do it. Send the new owner's id as newOwnerId. On success it returns 200 OK with an empty body.

This endpoint sits outside the objects routes

Unlike the create, edit, and delete calls, reassignment lives under /api/v1/sally/tasks/ rather than /api/v1/objects/. It takes the same Authorization: Bearer token, and it works on any task, not only ones an assistant created.

Path parameters

id integer · requiredNumeric identifier of the task to hand over.

Request body

newOwnerId user id · requiredThe colleague who should take the task. Use Find eligible assignees to get a valid id.

What the server checks

400 VALIDATION_FAILEDThe task is no longer open ("This task is no longer open, so it cannot be handed on"), newOwnerId is missing, it's already that person's, or that person can't take a task.
403 FORBIDDENYou don't hold the task and aren't an admin, or the new owner can't see a record the task is linked to.
409 CONFLICTAnother hand-off of the same task is in progress.

Only the current owner or a tenant admin can reassign, and only an open task can move.

PATCH /api/v1/sally/tasks/{id}/reassign
curl 'https://api.dreamteamcrm.ai/api/v1/sally/tasks/1044516/reassign' \
  -X PATCH \
  -H 'Authorization: Bearer <YOUR_TOKEN>' \
  -H 'Content-Type: application/json' \
  -d '{
    "newOwnerId": 1000061
  }'
# 200 OK
# The task was handed to the new owner. The response body is empty.
Task reassigned - no content returned.