Skip to content

Add a task

POST
/v1/tasks
curl --request POST \
--url https://api.threadkite.app/v1/tasks \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "threadId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "title": "Follow up with Sarah", "note": "example", "dueAt": "2026-04-15T12:00:00Z", "dueDate": "2026-10-08", "assigneeUserId": "example", "snoozeThread": false }'

For you, or for someone on a Full seat who can see the thread. Give dueAt for a time or dueDate for a day. snoozeThread also snoozes the thread until then.

Media typeapplication/json
object
threadId

The thread it is about; leave out for a task on its own

string format: uuid
nullable
title
required
string
>= 1 characters <= 200 characters

Example

Follow up with Sarah
note
string
nullable <= 2000 characters
dueAt

When it is due. Give this or dueDate.

string format: date-time
dueDate

The day it is due (all day, reminded at 9am in the thread’s location time zone). Give this or dueAt.

string format: date

Example

2026-10-08
assigneeUserId

Who does it (a Full seat who can see the thread). Defaults to you; API keys default to the thread owner.

string
>= 1 characters <= 100 characters
snoozeThread

Also snooze the thread until the task is due

boolean
Media typeapplication/json
object
id
required
string format: uuid
threadId
required
string format: uuid
nullable
inboxId
required

The thread’s inbox

string format: uuid
nullable
contact
required
One of:
object
id
required
string format: uuid
name
required
string
nullable
title
required
string
note
required
string
nullable
dueAt
required

When it is due; for an all-day task, 9am on its day (when it is reminded)

string format: date-time
dueAllDay
required
boolean
timeZone
required

The time zone its day belongs to

string
dueState
required

Against today, in your time zone

string
Allowed values: overdue today upcoming done
dueLabel
required
string
assignee
required
object
id
required
string
name
required
string
avatarUrl
required

Their picture; null to show their initials

string
nullable
completedAt
required
string format: date-time
nullable
completedBy
required
One of:
object
id
required
string
name
required
string
createdBy
required
One of:
object
id
required
string
name
required
string
origin
required
string
Allowed values: person api flow ai
canEdit
required

You can change, complete and delete it

boolean
createdAt
required
string format: date-time
updatedAt
required
string format: date-time

Example

{
"contact": {
"name": "Sarah Turner"
},
"title": "Follow up with Sarah",
"timeZone": "Europe/London",
"dueState": "overdue",
"dueLabel": "Tomorrow, 9am",
"assignee": {
"id": "usr_8f2c",
"name": "James Patel",
"avatarUrl": "https://api.threadkite.app/avatars/0b7c3a52-5d9e-4f3a-9a51-2f1e8c6d4b10.jpg"
},
"completedBy": {
"id": "usr_8f2c",
"name": "James Patel"
},
"createdBy": {
"id": "usr_8f2c",
"name": "James Patel"
},
"origin": "person"
}
Media typeapplication/json
object
statusCode
required
number
code
required

Stable machine-readable reason

string
message
required
string
errors

With code invalid: every problem with the request, by field (message is the first)

Array<object>
object
path
required

Dotted path inside the item, e.g. attributes.price.amountMinor

string
message
required
string

Example

{
"statusCode": 403,
"code": "forbidden",
"message": "You do not have permission to do that.",
"errors": [
{
"message": "Enter the make"
}
]
}

Missing or invalid API key

Media typeapplication/json
object
statusCode
required
number
code
required

Stable machine-readable reason

string
message
required
string
errors

With code invalid: every problem with the request, by field (message is the first)

Array<object>
object
path
required

Dotted path inside the item, e.g. attributes.price.amountMinor

string
message
required
string

Example

{
"statusCode": 403,
"code": "forbidden",
"message": "You do not have permission to do that.",
"errors": [
{
"message": "Enter the make"
}
]
}

The organisation is on the Free plan (code upgrade_required)

Media typeapplication/json
object
statusCode
required
number
code
required

Stable machine-readable reason

string
message
required
string
feature
required

The feature that needs Pro

string
nullable
Allowed values: extraSeats connections aiAssistant aiReplies rules fullReports api inboxes bulkMessages videoMessages
upgradePath
required

Where to upgrade or pay, in the web app

string

Example

{
"statusCode": 402,
"code": "upgrade_required",
"message": "Connections are part of Pro. Upgrade to connect texts, calls and more.",
"feature": "extraSeats",
"upgradePath": "/settings/billing"
}

The key does not have the scope (or the person the permission)

Media typeapplication/json
object
statusCode
required
number
code
required

Stable machine-readable reason

string
message
required
string
errors

With code invalid: every problem with the request, by field (message is the first)

Array<object>
object
path
required

Dotted path inside the item, e.g. attributes.price.amountMinor

string
message
required
string

Example

{
"statusCode": 403,
"code": "forbidden",
"message": "You do not have permission to do that.",
"errors": [
{
"message": "Enter the make"
}
]
}
Media typeapplication/json
object
statusCode
required
number
code
required

Stable machine-readable reason

string
message
required
string
errors

With code invalid: every problem with the request, by field (message is the first)

Array<object>
object
path
required

Dotted path inside the item, e.g. attributes.price.amountMinor

string
message
required
string

Example

{
"statusCode": 403,
"code": "forbidden",
"message": "You do not have permission to do that.",
"errors": [
{
"message": "Enter the make"
}
]
}

Rate limit reached

Media typeapplication/json
object
statusCode
required
number
code
required

Stable machine-readable reason

string
message
required
string
retryAfter
required

Seconds until another request will be accepted

number

Example

{
"statusCode": 429,
"code": "rate_limited",
"message": "Too many requests. Each key can make 120 requests a minute; try again in 12 seconds.",
"retryAfter": 12
}