curl --request POST \
--url https://core-api.getaptly.com/api/tasks \
--header 'Content-Type: application/json' \
--header 'x-token: <api-key>' \
--data '
{
"title": "Call the tenant",
"assigneeId": "usr_123",
"dueAt": "2026-06-10T00:00:00.000Z",
"type": "task",
"priority": "high",
"status": "notStarted"
}
'import requests
url = "https://core-api.getaptly.com/api/tasks"
payload = {
"title": "Call the tenant",
"assigneeId": "usr_123",
"dueAt": "2026-06-10T00:00:00.000Z",
"type": "task",
"priority": "high",
"status": "notStarted"
}
headers = {
"x-token": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-token': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
title: 'Call the tenant',
assigneeId: 'usr_123',
dueAt: '2026-06-10T00:00:00.000Z',
type: 'task',
priority: 'high',
status: 'notStarted'
})
};
fetch('https://core-api.getaptly.com/api/tasks', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://core-api.getaptly.com/api/tasks",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'title' => 'Call the tenant',
'assigneeId' => 'usr_123',
'dueAt' => '2026-06-10T00:00:00.000Z',
'type' => 'task',
'priority' => 'high',
'status' => 'notStarted'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-token: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://core-api.getaptly.com/api/tasks"
payload := strings.NewReader("{\n \"title\": \"Call the tenant\",\n \"assigneeId\": \"usr_123\",\n \"dueAt\": \"2026-06-10T00:00:00.000Z\",\n \"type\": \"task\",\n \"priority\": \"high\",\n \"status\": \"notStarted\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-token", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://core-api.getaptly.com/api/tasks")
.header("x-token", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"Call the tenant\",\n \"assigneeId\": \"usr_123\",\n \"dueAt\": \"2026-06-10T00:00:00.000Z\",\n \"type\": \"task\",\n \"priority\": \"high\",\n \"status\": \"notStarted\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://core-api.getaptly.com/api/tasks")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-token"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"title\": \"Call the tenant\",\n \"assigneeId\": \"usr_123\",\n \"dueAt\": \"2026-06-10T00:00:00.000Z\",\n \"type\": \"task\",\n \"priority\": \"high\",\n \"status\": \"notStarted\"\n}"
response = http.request(request)
puts response.read_body{
"taskId": "<string>"
}{
"error": "<string>",
"message": "<string>"
}Create a task
Creates a task. When aptletInstanceId is set, the task is also mirrored as a
checklist entry on that card.
The task is attributed to an acting user who must belong to the company. With a
delegate token the user is taken from the token. With an API key (no associated
user), supply userId in the body — it must belong to the company or the
request is rejected.
curl --request POST \
--url https://core-api.getaptly.com/api/tasks \
--header 'Content-Type: application/json' \
--header 'x-token: <api-key>' \
--data '
{
"title": "Call the tenant",
"assigneeId": "usr_123",
"dueAt": "2026-06-10T00:00:00.000Z",
"type": "task",
"priority": "high",
"status": "notStarted"
}
'import requests
url = "https://core-api.getaptly.com/api/tasks"
payload = {
"title": "Call the tenant",
"assigneeId": "usr_123",
"dueAt": "2026-06-10T00:00:00.000Z",
"type": "task",
"priority": "high",
"status": "notStarted"
}
headers = {
"x-token": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-token': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
title: 'Call the tenant',
assigneeId: 'usr_123',
dueAt: '2026-06-10T00:00:00.000Z',
type: 'task',
priority: 'high',
status: 'notStarted'
})
};
fetch('https://core-api.getaptly.com/api/tasks', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://core-api.getaptly.com/api/tasks",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'title' => 'Call the tenant',
'assigneeId' => 'usr_123',
'dueAt' => '2026-06-10T00:00:00.000Z',
'type' => 'task',
'priority' => 'high',
'status' => 'notStarted'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-token: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://core-api.getaptly.com/api/tasks"
payload := strings.NewReader("{\n \"title\": \"Call the tenant\",\n \"assigneeId\": \"usr_123\",\n \"dueAt\": \"2026-06-10T00:00:00.000Z\",\n \"type\": \"task\",\n \"priority\": \"high\",\n \"status\": \"notStarted\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-token", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://core-api.getaptly.com/api/tasks")
.header("x-token", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"Call the tenant\",\n \"assigneeId\": \"usr_123\",\n \"dueAt\": \"2026-06-10T00:00:00.000Z\",\n \"type\": \"task\",\n \"priority\": \"high\",\n \"status\": \"notStarted\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://core-api.getaptly.com/api/tasks")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-token"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"title\": \"Call the tenant\",\n \"assigneeId\": \"usr_123\",\n \"dueAt\": \"2026-06-10T00:00:00.000Z\",\n \"type\": \"task\",\n \"priority\": \"high\",\n \"status\": \"notStarted\"\n}"
response = http.request(request)
puts response.read_body{
"taskId": "<string>"
}{
"error": "<string>",
"message": "<string>"
}Authorizations
Body
User id the task is assigned to.
Follow-up type — one of email|comment|sms|voice|card|note|task|logActivity.
Acting user the task is attributed to (createdBy/updatedBy). Required with API-key auth (must belong to the company); ignored with a delegate token, which supplies the user itself.
Task description.
One of backlog|notStarted|inProgress|onHold|completed.
One of asap|high|medium|low.
Required when type is "logActivity".
Card id — when set the task is mirrored onto the card checklist, and its aptletUuid is taken from the card (a supplied one is ignored). 404 if the card doesn't exist.
Board UUID. Taken from the card instead when aptletInstanceId is set.
Checklist array field on the card (defaults to "checklist").
Response
Task created.