curl --request PATCH \
--url https://api.elean.app/v1/public/{projectSlug}/tasks/{taskId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"priority": "urgent",
"statusId": "018e1b2c-aaaa-0000-0000-000000000002"
}
'import requests
url = "https://api.elean.app/v1/public/{projectSlug}/tasks/{taskId}"
payload = {
"priority": "urgent",
"statusId": "018e1b2c-aaaa-0000-0000-000000000002"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({priority: 'urgent', statusId: '018e1b2c-aaaa-0000-0000-000000000002'})
};
fetch('https://api.elean.app/v1/public/{projectSlug}/tasks/{taskId}', 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://api.elean.app/v1/public/{projectSlug}/tasks/{taskId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'priority' => 'urgent',
'statusId' => '018e1b2c-aaaa-0000-0000-000000000002'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://api.elean.app/v1/public/{projectSlug}/tasks/{taskId}"
payload := strings.NewReader("{\n \"priority\": \"urgent\",\n \"statusId\": \"018e1b2c-aaaa-0000-0000-000000000002\"\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.patch("https://api.elean.app/v1/public/{projectSlug}/tasks/{taskId}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"priority\": \"urgent\",\n \"statusId\": \"018e1b2c-aaaa-0000-0000-000000000002\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.elean.app/v1/public/{projectSlug}/tasks/{taskId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"priority\": \"urgent\",\n \"statusId\": \"018e1b2c-aaaa-0000-0000-000000000002\"\n}"
response = http.request(request)
puts response.read_body{
"id": "018e1b2c-3d4e-5f6a-7b8c-9d0e1f2a3b4c",
"externalId": "PROJ-42",
"title": "Fix login bug",
"description": "Users cannot log in with SSO on Safari.",
"category": "in_progress",
"status": {
"id": "018e1b2c-aaaa-0000-0000-000000000002",
"name": "In Review",
"color": "#f59e0b",
"category": "in_progress"
},
"priority": "high",
"dueDate": "2026-03-15T00:00:00.000Z",
"assignees": [
{
"id": "018e1b2c-0000-0000-0000-000000000099",
"name": "Jane Smith"
}
],
"labels": [
{
"id": "018e1b2c-aaaa-0000-0000-000000000010",
"name": "bug",
"color": "#EF4444"
}
],
"attachments": [
{
"id": "018e1b2c-aaaa-bbbb-cccc-000000000001",
"filename": "screenshot.png"
}
],
"createdAt": "2026-03-01T12:00:00.000Z",
"updatedAt": "2026-03-02T09:30:00.000Z"
}{
"statusCode": 400,
"message": "title must be longer than or equal to 1 characters"
}{
"statusCode": 401,
"message": "Invalid API key"
}{
"statusCode": 403,
"message": "Missing required scope: task:create"
}{
"statusCode": 404,
"message": "Task not found"
}{
"statusCode": 429,
"message": "Too many requests"
}Update task
Updates one or more fields on an existing task. Only fields included in the request body are changed. Accepts either a UUID or an external ID (e.g. PROJ-42).
Requires the task:update scope.
curl --request PATCH \
--url https://api.elean.app/v1/public/{projectSlug}/tasks/{taskId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"priority": "urgent",
"statusId": "018e1b2c-aaaa-0000-0000-000000000002"
}
'import requests
url = "https://api.elean.app/v1/public/{projectSlug}/tasks/{taskId}"
payload = {
"priority": "urgent",
"statusId": "018e1b2c-aaaa-0000-0000-000000000002"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({priority: 'urgent', statusId: '018e1b2c-aaaa-0000-0000-000000000002'})
};
fetch('https://api.elean.app/v1/public/{projectSlug}/tasks/{taskId}', 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://api.elean.app/v1/public/{projectSlug}/tasks/{taskId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'priority' => 'urgent',
'statusId' => '018e1b2c-aaaa-0000-0000-000000000002'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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://api.elean.app/v1/public/{projectSlug}/tasks/{taskId}"
payload := strings.NewReader("{\n \"priority\": \"urgent\",\n \"statusId\": \"018e1b2c-aaaa-0000-0000-000000000002\"\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.patch("https://api.elean.app/v1/public/{projectSlug}/tasks/{taskId}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"priority\": \"urgent\",\n \"statusId\": \"018e1b2c-aaaa-0000-0000-000000000002\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.elean.app/v1/public/{projectSlug}/tasks/{taskId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"priority\": \"urgent\",\n \"statusId\": \"018e1b2c-aaaa-0000-0000-000000000002\"\n}"
response = http.request(request)
puts response.read_body{
"id": "018e1b2c-3d4e-5f6a-7b8c-9d0e1f2a3b4c",
"externalId": "PROJ-42",
"title": "Fix login bug",
"description": "Users cannot log in with SSO on Safari.",
"category": "in_progress",
"status": {
"id": "018e1b2c-aaaa-0000-0000-000000000002",
"name": "In Review",
"color": "#f59e0b",
"category": "in_progress"
},
"priority": "high",
"dueDate": "2026-03-15T00:00:00.000Z",
"assignees": [
{
"id": "018e1b2c-0000-0000-0000-000000000099",
"name": "Jane Smith"
}
],
"labels": [
{
"id": "018e1b2c-aaaa-0000-0000-000000000010",
"name": "bug",
"color": "#EF4444"
}
],
"attachments": [
{
"id": "018e1b2c-aaaa-bbbb-cccc-000000000001",
"filename": "screenshot.png"
}
],
"createdAt": "2026-03-01T12:00:00.000Z",
"updatedAt": "2026-03-02T09:30:00.000Z"
}{
"statusCode": 400,
"message": "title must be longer than or equal to 1 characters"
}{
"statusCode": 401,
"message": "Invalid API key"
}{
"statusCode": 403,
"message": "Missing required scope: task:create"
}{
"statusCode": 404,
"message": "Task not found"
}{
"statusCode": 429,
"message": "Too many requests"
}Authorizations
API key created in Workspace Settings → API Keys. Pass it in the Authorization header as a Bearer token, or in the X-API-Key header.
Format: el_ followed by 40 hex characters.
Path Parameters
The slug of the project.
"my-project"
UUID of the task, or its external ID (e.g. PROJ-42).
"PROJ-42"
Body
Fields to update. Only included fields are changed.
New task title.
1 - 500"Fix login bug (Safari)"
New description as plain text, or null to clear it.
"Reproducible on Safari 17+."
none, low, medium, high, urgent "urgent"
Due date in ISO 8601 format, or null to clear it.
"2026-04-01T00:00:00.000Z"
UUID of the custom status to assign.
"018e1b2c-aaaa-0000-0000-000000000002"
Replaces the full list of assignees. Pass an empty array to remove all assignees. Maximum 5. Use GET /{projectSlug}/members to retrieve available IDs.
["018e1b2c-0000-0000-0000-000000000099"]
Replaces the full list of labels. Pass an empty array to remove all labels. Use GET /{projectSlug}/labels to retrieve available IDs.
["018e1b2c-aaaa-0000-0000-000000000010"]
Response
Task updated successfully.
A task object returned by the API.
Unique identifier of the task.
"018e1b2c-3d4e-5f6a-7b8c-9d0e1f2a3b4c"
Human-readable task identifier, unique within the project (e.g. PROJ-42).
"PROJ-42"
Task title.
"Fix login bug"
Task description as plain text. Newlines are preserved.
"Users cannot log in with SSO on Safari."
Status category of the task. For the specific named status, see status.
todo, in_progress, done "in_progress"
The specific custom status assigned to this task, or null if none is set.
Show child attributes
Show child attributes
Priority level of the task.
none, low, medium, high, urgent "high"
Due date in ISO 8601 format, or null if not set.
"2026-03-15T00:00:00.000Z"
List of users assigned to the task.
Show child attributes
Show child attributes
Labels attached to the task.
Show child attributes
Show child attributes
Files attached to this task. Each entry contains only the attachment ID and filename. Use GET /{projectSlug}/tasks/{taskId}/attachments/{attachmentId} to retrieve the full attachment details including the download URL.
Show child attributes
Show child attributes
ISO 8601 timestamp of when the task was created.
"2026-03-01T12:00:00.000Z"
ISO 8601 timestamp of the last update.
"2026-03-02T09:30:00.000Z"