Référence de l'API
Tâches
Les tâches du tableau des tâches : créer, lier à un client ou un deal, déplacer, terminer et rouvrir.
Endpoints
-
GET
/tasksLister les tâches -
GET
/tasks/{task}Récupérer une tâche -
POST
/tasksCréer une tâche -
PATCH
/tasks/{task}Modifier une tâche -
POST
/tasks/{task}/moveDéplacer une tâche -
POST
/tasks/{task}/completeTerminer une tâche -
POST
/tasks/{task}/reopenRouvrir une tâche -
POST
/tasks/{task}/cancelAnnuler une tâche -
POST
/tasks/{task}/labelsModifier les étiquettes d’une tâche -
DELETE
/tasks/{task}Supprimer une tâche
Lister les tâches
/api/v1/tasks
Une liste de tâches, de la plus récente à la plus ancienne. Filtrez par statut, priorité, utilisateur, tableau, colonne, client ou date de modification.
- Scope
-
tasks.read— Lire les tâches, les tableaux et les commentaires - Fonctionnalité requise
tasks
Paramètres de requête
| Nom | Type | Description |
|---|---|---|
limit
|
integer | Nombre de résultats par page. de 1 à 100 · par défaut : 50 |
cursor
|
string | Le next_cursor ou prev_cursor de meta dans la réponse précédente. |
sort
|
string | Le champ sur lequel trier ; un signe moins devant signifie décroissant. Les champs que vous pouvez choisir et la valeur par défaut sont indiqués avec ce paramètre. l'une des valeurs : -created_at, created_at, -updated_at, updated_at · par défaut : -created_at |
filter[status]
|
string | Uniquement les tâches de ce statut : open, in_progress, completed ou cancelled. l'une des valeurs : open, in_progress, completed, cancelled |
filter[priority]
|
string | Uniquement les tâches de cette priorité. l'une des valeurs : low, normal, high, urgent |
filter[assigned_user_id]
|
string | Uniquement ce qui est assigné à cet utilisateur (l’id de Lister les utilisateurs). |
filter[board_id]
|
string (uuid) | Uniquement les tâches de ce tableau. |
filter[status_id]
|
string (uuid) | Uniquement les tâches de cette colonne. |
filter[customer_id]
|
string (uuid) | Uniquement ce qui appartient à ce client. |
filter[label_id]
|
string (uuid) | Uniquement les tâches portant cette étiquette propre (id depuis Lister les étiquettes). |
filter[updated_since]
|
string (date-time) | Uniquement ce qui a changé depuis ce moment : ISO 8601 avec fuseau horaire, par exemple 2026-09-14T10:15:00Z. Pratique pour synchroniser. Prévoyez un chevauchement de quelques minutes avec votre moment précédent, car l'horloge de votre système et celle de Klantly ne sont pas exactement synchronisées, et car une modification juste après votre moment précédent tomberait sinon de justesse en dehors. La limite est inclusive : un élément modifié exactement à cet instant est inclus. |
Exemple de requête
curl "https://app.klantly.com/api/v1/tasks?filter[status]=open" \
-H "Authorization: Bearer $KLANTLY_API_KEY"$client = new \GuzzleHttp\Client([
'base_uri' => 'https://app.klantly.com/api/v1/',
'headers' => ['Authorization' => 'Bearer ' . getenv('KLANTLY_API_KEY')],
]);
$response = $client->request('GET', 'tasks', [
'query' => [
'filter[status]' => 'open',
],
]);
$data = json_decode((string) $response->getBody(), true)['data'];const response = await fetch('https://app.klantly.com/api/v1/tasks?filter[status]=open', {
headers: {
Authorization: `Bearer ${process.env.KLANTLY_API_KEY}`,
},
});
const { data } = await response.json();import os
import requests
response = requests.get(
"https://app.klantly.com/api/v1/tasks",
headers={
"Authorization": f"Bearer {os.environ['KLANTLY_API_KEY']}",
},
params={
"filter[status]": "open"
},
)
data = response.json()["data"]Réponse 200
La réponse est une liste avec pagination par curseur : data contient les objets, meta la pagination.
{
"data": [
{
"object": "task",
"id": "9d3f7fc5-6bad-4c2a-9f7e-8d9bacbdced6",
"title": "Offerte nabellen",
"description": null,
"status": "open",
"priority": "normal",
"due_date": "2026-10-01",
"board_id": "9d3f80e6-7cbe-4d3b-8a8f-9eacbdcedfe7",
"status_id": "9d3f8207-8dcf-4e4c-9b9a-afbdcedfe0f8",
"assigned_user_id": "usr_0k3j9x21m4zq8p",
"links": [
{
"object": "customer",
"id": "9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70"
}
],
"has_open_actions": false,
"labels": [
{
"object": "deal_label",
"id": "4b8e2c10-7d3a-4f6e-9a1b-2c3d4e5f6a70",
"name": "HEET",
"color": "#DC2626",
"group": "Urgentie"
}
],
"deal_id": null,
"deal_labels": [],
"completed_at": null,
"cancelled_at": null,
"created_at": "2026-09-14T10:15:00Z",
"updated_at": "2026-09-14T10:15:00Z"
}
],
"meta": {
"limit": 50,
"next_cursor": "eyJpZCI6IjlkM2Y2YzFlIn0",
"prev_cursor": null
}
}Erreurs possibles
-
403
insufficient_scope— Cette clé API n'a pas accès à cette action. -
422
validation_failed— Les données saisies ne sont pas valides.
Récupérer une tâche
/api/v1/tasks/{task}
Une tâche par id, avec ses liens et l’indication d’actions encore ouvertes.
- Scope
-
tasks.read— Lire les tâches, les tableaux et les commentaires - Fonctionnalité requise
tasks
Paramètres de chemin
| Nom | Type | Description |
|---|---|---|
task obligatoire |
string (uuid) | L’id (UUID) de la tâche. |
Exemple de requête
curl "https://app.klantly.com/api/v1/tasks/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70" \
-H "Authorization: Bearer $KLANTLY_API_KEY"$client = new \GuzzleHttp\Client([
'base_uri' => 'https://app.klantly.com/api/v1/',
'headers' => ['Authorization' => 'Bearer ' . getenv('KLANTLY_API_KEY')],
]);
$response = $client->request('GET', 'tasks/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70');
$data = json_decode((string) $response->getBody(), true)['data'];const response = await fetch('https://app.klantly.com/api/v1/tasks/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70', {
headers: {
Authorization: `Bearer ${process.env.KLANTLY_API_KEY}`,
},
});
const { data } = await response.json();import os
import requests
response = requests.get(
"https://app.klantly.com/api/v1/tasks/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70",
headers={
"Authorization": f"Bearer {os.environ['KLANTLY_API_KEY']}",
},
)
data = response.json()["data"]Réponse 200
{
"data": {
"object": "task",
"id": "9d3f7fc5-6bad-4c2a-9f7e-8d9bacbdced6",
"title": "Offerte nabellen",
"description": null,
"status": "open",
"priority": "normal",
"due_date": "2026-10-01",
"board_id": "9d3f80e6-7cbe-4d3b-8a8f-9eacbdcedfe7",
"status_id": "9d3f8207-8dcf-4e4c-9b9a-afbdcedfe0f8",
"assigned_user_id": "usr_0k3j9x21m4zq8p",
"links": [
{
"object": "customer",
"id": "9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70"
}
],
"has_open_actions": false,
"labels": [
{
"object": "deal_label",
"id": "4b8e2c10-7d3a-4f6e-9a1b-2c3d4e5f6a70",
"name": "HEET",
"color": "#DC2626",
"group": "Urgentie"
}
],
"deal_id": null,
"deal_labels": [],
"completed_at": null,
"cancelled_at": null,
"created_at": "2026-09-14T10:15:00Z",
"updated_at": "2026-09-14T10:15:00Z"
}
}Erreurs possibles
-
403
insufficient_scope— Cette clé API n'a pas accès à cette action. -
404
not_found— Introuvable.
Créer une tâche
/api/v1/tasks
Crée une tâche. Sans status_id, elle arrive dans la colonne ouverte du tableau par défaut. Avec links, liez-la à un client, un deal, un rendez-vous, un bon d’intervention, un devis ou une facture. Avec label_ids, elle reçoit tout de suite ses propres étiquettes. L’utilisateur assigné reçoit une notification, comme à l’écran.
- Scope
-
tasks.write— Créer, modifier, déplacer et terminer des tâches, et publier des commentaires - Fonctionnalité requise
tasks
Envoyez une Idempotency-Key : une nouvelle tentative après un délai d'attente ne crée alors jamais de doublon.
Corps (JSON)
| Champ | Type | Description |
|---|---|---|
title
obligatoire
|
string | Titre de la tâche. au maximum 500 caractères |
description
facultatif
|
string | Description. peut être vide (null) · au maximum 10000 caractères |
priority
facultatif
|
string | low, normal (par défaut), high ou urgent. l'une des valeurs : low, normal, high, urgent |
due_date
facultatif
|
string (date) | Échéance au format AAAA-MM-JJ, ou null. peut être vide (null) |
assigned_user_id
facultatif
|
string | L’utilisateur qui réalise la tâche, ou null. peut être vide (null) |
status_id
facultatif
|
string (uuid) | La colonne du tableau. Facultatif à la création ; sans colonne : la colonne ouverte du tableau par défaut. peut être vide (null) |
links
facultatif
|
array | Les enregistrements auxquels la tâche appartient (20 au maximum). |
label_ids
facultatif
|
array | Uniquement à la création : ids des étiquettes (GET /deal-labels) que la tâche reçoit tout de suite. Les étiquettes d’un même groupe s’excluent ; une étiquette inconnue donne not_found. |
Exemple de requête
curl -X POST "https://app.klantly.com/api/v1/tasks" \
-H "Authorization: Bearer $KLANTLY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f" \
-d '{
"title": "Offerte nabellen",
"due_date": "2026-10-01",
"assigned_user_id": "usr_0k3j9x21m4zq8p",
"links": [
{
"object": "customer",
"id": "9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70"
}
],
"label_ids": [
"4b8e2c10-7d3a-4f6e-9a1b-2c3d4e5f6a70"
]
}'$client = new \GuzzleHttp\Client([
'base_uri' => 'https://app.klantly.com/api/v1/',
'headers' => ['Authorization' => 'Bearer ' . getenv('KLANTLY_API_KEY')],
]);
$response = $client->request('POST', 'tasks', [
'headers' => [
'Idempotency-Key' => '6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f',
],
'json' => [
'title' => 'Offerte nabellen',
'due_date' => '2026-10-01',
'assigned_user_id' => 'usr_0k3j9x21m4zq8p',
'links' => [
0 => [
'object' => 'customer',
'id' => '9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70',
],
],
'label_ids' => [
0 => '4b8e2c10-7d3a-4f6e-9a1b-2c3d4e5f6a70',
],
],
]);
$data = json_decode((string) $response->getBody(), true)['data'];const response = await fetch('https://app.klantly.com/api/v1/tasks', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.KLANTLY_API_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': '6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f',
},
body: JSON.stringify({
"title": "Offerte nabellen",
"due_date": "2026-10-01",
"assigned_user_id": "usr_0k3j9x21m4zq8p",
"links": [
{
"object": "customer",
"id": "9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70"
}
],
"label_ids": [
"4b8e2c10-7d3a-4f6e-9a1b-2c3d4e5f6a70"
]
}),
});
const { data } = await response.json();import os
import requests
response = requests.post(
"https://app.klantly.com/api/v1/tasks",
headers={
"Authorization": f"Bearer {os.environ['KLANTLY_API_KEY']}",
"Idempotency-Key": "6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
},
json={
"title": "Offerte nabellen",
"due_date": "2026-10-01",
"assigned_user_id": "usr_0k3j9x21m4zq8p",
"links": [
{
"object": "customer",
"id": "9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70"
}
],
"label_ids": [
"4b8e2c10-7d3a-4f6e-9a1b-2c3d4e5f6a70"
]
},
)
data = response.json()["data"]Réponse 201
{
"data": {
"object": "task",
"id": "9d3f7fc5-6bad-4c2a-9f7e-8d9bacbdced6",
"title": "Offerte nabellen",
"description": null,
"status": "open",
"priority": "normal",
"due_date": "2026-10-01",
"board_id": "9d3f80e6-7cbe-4d3b-8a8f-9eacbdcedfe7",
"status_id": "9d3f8207-8dcf-4e4c-9b9a-afbdcedfe0f8",
"assigned_user_id": "usr_0k3j9x21m4zq8p",
"links": [
{
"object": "customer",
"id": "9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70"
}
],
"has_open_actions": false,
"labels": [
{
"object": "deal_label",
"id": "4b8e2c10-7d3a-4f6e-9a1b-2c3d4e5f6a70",
"name": "HEET",
"color": "#DC2626",
"group": "Urgentie"
}
],
"deal_id": null,
"deal_labels": [],
"completed_at": null,
"cancelled_at": null,
"created_at": "2026-09-14T10:15:00Z",
"updated_at": "2026-09-14T10:15:00Z"
}
}Erreurs possibles
-
403
insufficient_scope— Cette clé API n'a pas accès à cette action. -
422
validation_failed— Les données saisies ne sont pas valides. -
422
unknown_field— Les données contiennent un champ inconnu. -
415
unsupported_media_type— Ce format n'est pas pris en charge. -
413
payload_too_large— Le corps de la requête est trop volumineux. -
404
not_found— Introuvable. -
422
idempotency_key_reused— Cette Idempotency-Key a déjà été utilisée pour une autre requête. -
409
idempotency_in_progress— Une requête avec cette Idempotency-Key est encore en cours.
Modifier une tâche
/api/v1/tasks/{task}
Ne modifie que les champs envoyés. links remplace l’ensemble des liens ; les liens que l’API n’affiche pas (par exemple avec une conversation) sont conservés, et renvoyer les mêmes liens ne change rien. Une modification apparaît dans l’historique de la tâche, comme à l’écran. Pour changer la colonne ou le statut, utilisez déplacer, terminer, rouvrir ou annuler.
- Scope
-
tasks.write— Créer, modifier, déplacer et terminer des tâches, et publier des commentaires - Fonctionnalité requise
tasks
Envoyez l'ETag dans If-Match : vous n'écraserez jamais par erreur une version plus récente.
Paramètres de chemin
| Nom | Type | Description |
|---|---|---|
task obligatoire |
string (uuid) | L’id (UUID) de la tâche. |
Corps (JSON)
| Champ | Type | Description |
|---|---|---|
title
facultatif
|
string | Titre de la tâche. au maximum 500 caractères |
description
facultatif
|
string | Description. peut être vide (null) · au maximum 10000 caractères |
priority
facultatif
|
string | low, normal (par défaut), high ou urgent. l'une des valeurs : low, normal, high, urgent |
due_date
facultatif
|
string (date) | Échéance au format AAAA-MM-JJ, ou null. peut être vide (null) |
assigned_user_id
facultatif
|
string | L’utilisateur qui réalise la tâche, ou null. peut être vide (null) |
links
facultatif
|
array | Les enregistrements auxquels la tâche appartient (20 au maximum). |
Exemple de requête
curl -X PATCH "https://app.klantly.com/api/v1/tasks/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70" \
-H "Authorization: Bearer $KLANTLY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"priority": "high"
}'$client = new \GuzzleHttp\Client([
'base_uri' => 'https://app.klantly.com/api/v1/',
'headers' => ['Authorization' => 'Bearer ' . getenv('KLANTLY_API_KEY')],
]);
$response = $client->request('PATCH', 'tasks/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70', [
'json' => [
'priority' => 'high',
],
]);
$data = json_decode((string) $response->getBody(), true)['data'];const response = await fetch('https://app.klantly.com/api/v1/tasks/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70', {
method: 'PATCH',
headers: {
Authorization: `Bearer ${process.env.KLANTLY_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"priority": "high"
}),
});
const { data } = await response.json();import os
import requests
response = requests.patch(
"https://app.klantly.com/api/v1/tasks/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70",
headers={
"Authorization": f"Bearer {os.environ['KLANTLY_API_KEY']}",
},
json={
"priority": "high"
},
)
data = response.json()["data"]Réponse 200
{
"data": {
"object": "task",
"id": "9d3f7fc5-6bad-4c2a-9f7e-8d9bacbdced6",
"title": "Offerte nabellen",
"description": null,
"status": "open",
"priority": "normal",
"due_date": "2026-10-01",
"board_id": "9d3f80e6-7cbe-4d3b-8a8f-9eacbdcedfe7",
"status_id": "9d3f8207-8dcf-4e4c-9b9a-afbdcedfe0f8",
"assigned_user_id": "usr_0k3j9x21m4zq8p",
"links": [
{
"object": "customer",
"id": "9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70"
}
],
"has_open_actions": false,
"labels": [
{
"object": "deal_label",
"id": "4b8e2c10-7d3a-4f6e-9a1b-2c3d4e5f6a70",
"name": "HEET",
"color": "#DC2626",
"group": "Urgentie"
}
],
"deal_id": null,
"deal_labels": [],
"completed_at": null,
"cancelled_at": null,
"created_at": "2026-09-14T10:15:00Z",
"updated_at": "2026-09-14T10:15:00Z"
}
}Erreurs possibles
-
403
insufficient_scope— Cette clé API n'a pas accès à cette action. -
422
validation_failed— Les données saisies ne sont pas valides. -
422
unknown_field— Les données contiennent un champ inconnu. -
415
unsupported_media_type— Ce format n'est pas pris en charge. -
413
payload_too_large— Le corps de la requête est trop volumineux. -
404
not_found— Introuvable. -
412
precondition_failed— L'enregistrement a été modifié entre-temps.
Déplacer une tâche
/api/v1/tasks/{task}/move
Déplace la tâche vers une autre colonne, comme un glisser-déposer sur le tableau. La colonne détermine le statut. Impossible vers une colonne terminée tant qu’il reste des actions ouvertes.
- Scope
-
tasks.write— Créer, modifier, déplacer et terminer des tâches, et publier des commentaires - Fonctionnalité requise
tasks
Envoyez une Idempotency-Key : une nouvelle tentative après un délai d'attente ne crée alors jamais de doublon.
Paramètres de chemin
| Nom | Type | Description |
|---|---|---|
task obligatoire |
string (uuid) | L’id (UUID) de la tâche. |
Corps (JSON)
| Champ | Type | Description |
|---|---|---|
status_id
obligatoire
|
string (uuid) | L’id de la colonne vers laquelle la tâche est déplacée (de Lister les tableaux de tâches). |
Exemple de requête
curl -X POST "https://app.klantly.com/api/v1/tasks/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70/move" \
-H "Authorization: Bearer $KLANTLY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f" \
-d '{
"status_id": "9d3f8207-8dcf-4e4c-9b9a-afbdcedfe0f8"
}'$client = new \GuzzleHttp\Client([
'base_uri' => 'https://app.klantly.com/api/v1/',
'headers' => ['Authorization' => 'Bearer ' . getenv('KLANTLY_API_KEY')],
]);
$response = $client->request('POST', 'tasks/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70/move', [
'headers' => [
'Idempotency-Key' => '6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f',
],
'json' => [
'status_id' => '9d3f8207-8dcf-4e4c-9b9a-afbdcedfe0f8',
],
]);
$data = json_decode((string) $response->getBody(), true)['data'];const response = await fetch('https://app.klantly.com/api/v1/tasks/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70/move', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.KLANTLY_API_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': '6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f',
},
body: JSON.stringify({
"status_id": "9d3f8207-8dcf-4e4c-9b9a-afbdcedfe0f8"
}),
});
const { data } = await response.json();import os
import requests
response = requests.post(
"https://app.klantly.com/api/v1/tasks/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70/move",
headers={
"Authorization": f"Bearer {os.environ['KLANTLY_API_KEY']}",
"Idempotency-Key": "6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
},
json={
"status_id": "9d3f8207-8dcf-4e4c-9b9a-afbdcedfe0f8"
},
)
data = response.json()["data"]Réponse 200
{
"data": {
"object": "task",
"id": "9d3f7fc5-6bad-4c2a-9f7e-8d9bacbdced6",
"title": "Offerte nabellen",
"description": null,
"status": "open",
"priority": "normal",
"due_date": "2026-10-01",
"board_id": "9d3f80e6-7cbe-4d3b-8a8f-9eacbdcedfe7",
"status_id": "9d3f8207-8dcf-4e4c-9b9a-afbdcedfe0f8",
"assigned_user_id": "usr_0k3j9x21m4zq8p",
"links": [
{
"object": "customer",
"id": "9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70"
}
],
"has_open_actions": false,
"labels": [
{
"object": "deal_label",
"id": "4b8e2c10-7d3a-4f6e-9a1b-2c3d4e5f6a70",
"name": "HEET",
"color": "#DC2626",
"group": "Urgentie"
}
],
"deal_id": null,
"deal_labels": [],
"completed_at": null,
"cancelled_at": null,
"created_at": "2026-09-14T10:15:00Z",
"updated_at": "2026-09-14T10:15:00Z"
}
}Erreurs possibles
-
403
insufficient_scope— Cette clé API n'a pas accès à cette action. -
422
validation_failed— Les données saisies ne sont pas valides. -
422
unknown_field— Les données contiennent un champ inconnu. -
415
unsupported_media_type— Ce format n'est pas pris en charge. -
413
payload_too_large— Le corps de la requête est trop volumineux. -
404
not_found— Introuvable. -
409
invalid_state_transition— Cette action n'est pas possible dans le statut actuel. -
422
idempotency_key_reused— Cette Idempotency-Key a déjà été utilisée pour une autre requête. -
409
idempotency_in_progress— Une requête avec cette Idempotency-Key est encore en cours.
Terminer une tâche
/api/v1/tasks/{task}/complete
Termine la tâche. S’il reste des actions ouvertes, vous recevez une 409 : terminez-les ou ignorez-les d’abord dans Klantly.
- Scope
-
tasks.write— Créer, modifier, déplacer et terminer des tâches, et publier des commentaires - Fonctionnalité requise
tasks
Envoyez une Idempotency-Key : une nouvelle tentative après un délai d'attente ne crée alors jamais de doublon.
Paramètres de chemin
| Nom | Type | Description |
|---|---|---|
task obligatoire |
string (uuid) | L’id (UUID) de la tâche. |
Exemple de requête
curl -X POST "https://app.klantly.com/api/v1/tasks/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70/complete" \
-H "Authorization: Bearer $KLANTLY_API_KEY" \
-H "Idempotency-Key: 6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f"$client = new \GuzzleHttp\Client([
'base_uri' => 'https://app.klantly.com/api/v1/',
'headers' => ['Authorization' => 'Bearer ' . getenv('KLANTLY_API_KEY')],
]);
$response = $client->request('POST', 'tasks/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70/complete', [
'headers' => [
'Idempotency-Key' => '6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f',
],
]);
$data = json_decode((string) $response->getBody(), true)['data'];const response = await fetch('https://app.klantly.com/api/v1/tasks/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70/complete', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.KLANTLY_API_KEY}`,
'Idempotency-Key': '6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f',
},
});
const { data } = await response.json();import os
import requests
response = requests.post(
"https://app.klantly.com/api/v1/tasks/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70/complete",
headers={
"Authorization": f"Bearer {os.environ['KLANTLY_API_KEY']}",
"Idempotency-Key": "6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
},
)
data = response.json()["data"]Réponse 200
{
"data": {
"object": "task",
"id": "9d3f7fc5-6bad-4c2a-9f7e-8d9bacbdced6",
"title": "Offerte nabellen",
"description": null,
"status": "open",
"priority": "normal",
"due_date": "2026-10-01",
"board_id": "9d3f80e6-7cbe-4d3b-8a8f-9eacbdcedfe7",
"status_id": "9d3f8207-8dcf-4e4c-9b9a-afbdcedfe0f8",
"assigned_user_id": "usr_0k3j9x21m4zq8p",
"links": [
{
"object": "customer",
"id": "9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70"
}
],
"has_open_actions": false,
"labels": [
{
"object": "deal_label",
"id": "4b8e2c10-7d3a-4f6e-9a1b-2c3d4e5f6a70",
"name": "HEET",
"color": "#DC2626",
"group": "Urgentie"
}
],
"deal_id": null,
"deal_labels": [],
"completed_at": null,
"cancelled_at": null,
"created_at": "2026-09-14T10:15:00Z",
"updated_at": "2026-09-14T10:15:00Z"
}
}Erreurs possibles
-
403
insufficient_scope— Cette clé API n'a pas accès à cette action. -
404
not_found— Introuvable. -
409
invalid_state_transition— Cette action n'est pas possible dans le statut actuel. -
422
idempotency_key_reused— Cette Idempotency-Key a déjà été utilisée pour une autre requête. -
409
idempotency_in_progress— Une requête avec cette Idempotency-Key est encore en cours.
Rouvrir une tâche
/api/v1/tasks/{task}/reopen
Remet une tâche terminée ou annulée au statut ouvert.
- Scope
-
tasks.write— Créer, modifier, déplacer et terminer des tâches, et publier des commentaires - Fonctionnalité requise
tasks
Envoyez une Idempotency-Key : une nouvelle tentative après un délai d'attente ne crée alors jamais de doublon.
Paramètres de chemin
| Nom | Type | Description |
|---|---|---|
task obligatoire |
string (uuid) | L’id (UUID) de la tâche. |
Exemple de requête
curl -X POST "https://app.klantly.com/api/v1/tasks/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70/reopen" \
-H "Authorization: Bearer $KLANTLY_API_KEY" \
-H "Idempotency-Key: 6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f"$client = new \GuzzleHttp\Client([
'base_uri' => 'https://app.klantly.com/api/v1/',
'headers' => ['Authorization' => 'Bearer ' . getenv('KLANTLY_API_KEY')],
]);
$response = $client->request('POST', 'tasks/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70/reopen', [
'headers' => [
'Idempotency-Key' => '6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f',
],
]);
$data = json_decode((string) $response->getBody(), true)['data'];const response = await fetch('https://app.klantly.com/api/v1/tasks/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70/reopen', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.KLANTLY_API_KEY}`,
'Idempotency-Key': '6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f',
},
});
const { data } = await response.json();import os
import requests
response = requests.post(
"https://app.klantly.com/api/v1/tasks/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70/reopen",
headers={
"Authorization": f"Bearer {os.environ['KLANTLY_API_KEY']}",
"Idempotency-Key": "6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
},
)
data = response.json()["data"]Réponse 200
{
"data": {
"object": "task",
"id": "9d3f7fc5-6bad-4c2a-9f7e-8d9bacbdced6",
"title": "Offerte nabellen",
"description": null,
"status": "open",
"priority": "normal",
"due_date": "2026-10-01",
"board_id": "9d3f80e6-7cbe-4d3b-8a8f-9eacbdcedfe7",
"status_id": "9d3f8207-8dcf-4e4c-9b9a-afbdcedfe0f8",
"assigned_user_id": "usr_0k3j9x21m4zq8p",
"links": [
{
"object": "customer",
"id": "9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70"
}
],
"has_open_actions": false,
"labels": [
{
"object": "deal_label",
"id": "4b8e2c10-7d3a-4f6e-9a1b-2c3d4e5f6a70",
"name": "HEET",
"color": "#DC2626",
"group": "Urgentie"
}
],
"deal_id": null,
"deal_labels": [],
"completed_at": null,
"cancelled_at": null,
"created_at": "2026-09-14T10:15:00Z",
"updated_at": "2026-09-14T10:15:00Z"
}
}Erreurs possibles
-
403
insufficient_scope— Cette clé API n'a pas accès à cette action. -
404
not_found— Introuvable. -
422
idempotency_key_reused— Cette Idempotency-Key a déjà été utilisée pour une autre requête. -
409
idempotency_in_progress— Une requête avec cette Idempotency-Key est encore en cours.
Annuler une tâche
/api/v1/tasks/{task}/cancel
Annule la tâche.
- Scope
-
tasks.write— Créer, modifier, déplacer et terminer des tâches, et publier des commentaires - Fonctionnalité requise
tasks
Envoyez une Idempotency-Key : une nouvelle tentative après un délai d'attente ne crée alors jamais de doublon.
Paramètres de chemin
| Nom | Type | Description |
|---|---|---|
task obligatoire |
string (uuid) | L’id (UUID) de la tâche. |
Exemple de requête
curl -X POST "https://app.klantly.com/api/v1/tasks/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70/cancel" \
-H "Authorization: Bearer $KLANTLY_API_KEY" \
-H "Idempotency-Key: 6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f"$client = new \GuzzleHttp\Client([
'base_uri' => 'https://app.klantly.com/api/v1/',
'headers' => ['Authorization' => 'Bearer ' . getenv('KLANTLY_API_KEY')],
]);
$response = $client->request('POST', 'tasks/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70/cancel', [
'headers' => [
'Idempotency-Key' => '6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f',
],
]);
$data = json_decode((string) $response->getBody(), true)['data'];const response = await fetch('https://app.klantly.com/api/v1/tasks/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70/cancel', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.KLANTLY_API_KEY}`,
'Idempotency-Key': '6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f',
},
});
const { data } = await response.json();import os
import requests
response = requests.post(
"https://app.klantly.com/api/v1/tasks/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70/cancel",
headers={
"Authorization": f"Bearer {os.environ['KLANTLY_API_KEY']}",
"Idempotency-Key": "6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
},
)
data = response.json()["data"]Réponse 200
{
"data": {
"object": "task",
"id": "9d3f7fc5-6bad-4c2a-9f7e-8d9bacbdced6",
"title": "Offerte nabellen",
"description": null,
"status": "open",
"priority": "normal",
"due_date": "2026-10-01",
"board_id": "9d3f80e6-7cbe-4d3b-8a8f-9eacbdcedfe7",
"status_id": "9d3f8207-8dcf-4e4c-9b9a-afbdcedfe0f8",
"assigned_user_id": "usr_0k3j9x21m4zq8p",
"links": [
{
"object": "customer",
"id": "9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70"
}
],
"has_open_actions": false,
"labels": [
{
"object": "deal_label",
"id": "4b8e2c10-7d3a-4f6e-9a1b-2c3d4e5f6a70",
"name": "HEET",
"color": "#DC2626",
"group": "Urgentie"
}
],
"deal_id": null,
"deal_labels": [],
"completed_at": null,
"cancelled_at": null,
"created_at": "2026-09-14T10:15:00Z",
"updated_at": "2026-09-14T10:15:00Z"
}
}Erreurs possibles
-
403
insufficient_scope— Cette clé API n'a pas accès à cette action. -
404
not_found— Introuvable. -
422
idempotency_key_reused— Cette Idempotency-Key a déjà été utilisée pour une autre requête. -
409
idempotency_in_progress— Une requête avec cette Idempotency-Key est encore en cours.
Modifier les étiquettes d’une tâche
/api/v1/tasks/{task}/labels
Ajoute des étiquettes propres à la tâche (add) ou les retire (remove), du même ensemble que les affaires (GET /deal-labels). Les étiquettes d’un même groupe s’excluent : ajouter CHAUD retire PRINTEMPS. Une étiquette d’une autre entreprise renvoie not_found. Renvoie la tâche avec ses nouvelles étiquettes.
- Scope
-
tasks.write— Créer, modifier, déplacer et terminer des tâches, et publier des commentaires - Fonctionnalité requise
tasks, pipeline
Envoyez une Idempotency-Key : une nouvelle tentative après un délai d'attente ne crée alors jamais de doublon.
Paramètres de chemin
| Nom | Type | Description |
|---|---|---|
task obligatoire |
string (uuid) | L’id (UUID) de la tâche. |
Corps (JSON)
| Champ | Type | Description |
|---|---|---|
add
facultatif
|
array | Ids des étiquettes à ajouter à l’affaire. |
remove
facultatif
|
array | Ids des étiquettes à retirer. |
Exemple de requête
curl -X POST "https://app.klantly.com/api/v1/tasks/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70/labels" \
-H "Authorization: Bearer $KLANTLY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f" \
-d '{
"add": [
"4b8e2c10-7d3a-4f6e-9a1b-2c3d4e5f6a70"
]
}'$client = new \GuzzleHttp\Client([
'base_uri' => 'https://app.klantly.com/api/v1/',
'headers' => ['Authorization' => 'Bearer ' . getenv('KLANTLY_API_KEY')],
]);
$response = $client->request('POST', 'tasks/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70/labels', [
'headers' => [
'Idempotency-Key' => '6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f',
],
'json' => [
'add' => [
0 => '4b8e2c10-7d3a-4f6e-9a1b-2c3d4e5f6a70',
],
],
]);
$data = json_decode((string) $response->getBody(), true)['data'];const response = await fetch('https://app.klantly.com/api/v1/tasks/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70/labels', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.KLANTLY_API_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': '6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f',
},
body: JSON.stringify({
"add": [
"4b8e2c10-7d3a-4f6e-9a1b-2c3d4e5f6a70"
]
}),
});
const { data } = await response.json();import os
import requests
response = requests.post(
"https://app.klantly.com/api/v1/tasks/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70/labels",
headers={
"Authorization": f"Bearer {os.environ['KLANTLY_API_KEY']}",
"Idempotency-Key": "6f1c2d3e-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
},
json={
"add": [
"4b8e2c10-7d3a-4f6e-9a1b-2c3d4e5f6a70"
]
},
)
data = response.json()["data"]Réponse 200
{
"data": {
"object": "task",
"id": "9d3f7fc5-6bad-4c2a-9f7e-8d9bacbdced6",
"title": "Offerte nabellen",
"description": null,
"status": "open",
"priority": "normal",
"due_date": "2026-10-01",
"board_id": "9d3f80e6-7cbe-4d3b-8a8f-9eacbdcedfe7",
"status_id": "9d3f8207-8dcf-4e4c-9b9a-afbdcedfe0f8",
"assigned_user_id": "usr_0k3j9x21m4zq8p",
"links": [
{
"object": "customer",
"id": "9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70"
}
],
"has_open_actions": false,
"labels": [
{
"object": "deal_label",
"id": "4b8e2c10-7d3a-4f6e-9a1b-2c3d4e5f6a70",
"name": "HEET",
"color": "#DC2626",
"group": "Urgentie"
}
],
"deal_id": null,
"deal_labels": [],
"completed_at": null,
"cancelled_at": null,
"created_at": "2026-09-14T10:15:00Z",
"updated_at": "2026-09-14T10:15:00Z"
}
}Erreurs possibles
-
403
insufficient_scope— Cette clé API n'a pas accès à cette action. -
422
validation_failed— Les données saisies ne sont pas valides. -
422
unknown_field— Les données contiennent un champ inconnu. -
415
unsupported_media_type— Ce format n'est pas pris en charge. -
413
payload_too_large— Le corps de la requête est trop volumineux. -
404
not_found— Introuvable. -
422
idempotency_key_reused— Cette Idempotency-Key a déjà été utilisée pour une autre requête. -
409
idempotency_in_progress— Une requête avec cette Idempotency-Key est encore en cours.
Supprimer une tâche
/api/v1/tasks/{task}
Supprime définitivement la tâche, avec ses commentaires et ses actions.
- Scope
-
tasks.delete— Supprimer des tâches - Fonctionnalité requise
tasks
Paramètres de chemin
| Nom | Type | Description |
|---|---|---|
task obligatoire |
string (uuid) | L’id (UUID) de la tâche. |
Exemple de requête
curl -X DELETE "https://app.klantly.com/api/v1/tasks/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70" \
-H "Authorization: Bearer $KLANTLY_API_KEY"$client = new \GuzzleHttp\Client([
'base_uri' => 'https://app.klantly.com/api/v1/',
'headers' => ['Authorization' => 'Bearer ' . getenv('KLANTLY_API_KEY')],
]);
$response = $client->request('DELETE', 'tasks/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70');
$data = json_decode((string) $response->getBody(), true)['data'];const response = await fetch('https://app.klantly.com/api/v1/tasks/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70', {
method: 'DELETE',
headers: {
Authorization: `Bearer ${process.env.KLANTLY_API_KEY}`,
},
});
const { data } = await response.json();import os
import requests
response = requests.delete(
"https://app.klantly.com/api/v1/tasks/9d3f6c1e-4b2a-4c8e-9f1a-2b3c4d5e6f70",
headers={
"Authorization": f"Bearer {os.environ['KLANTLY_API_KEY']}",
},
)
data = response.json()["data"]Réponse 200
{
"data": {
"object": "note",
"id": "9d3f7b41-2d6f-4e8c-9b3a-4f5d6e7a8b92",
"deleted": true
}
}Erreurs possibles
-
403
insufficient_scope— Cette clé API n'a pas accès à cette action. -
404
not_found— Introuvable.
L'objet
Tous les champs sont toujours présents ; un champ sans valeur vaut null.
| Champ | Type | Description |
|---|---|---|
object |
string | Toujours « task ». |
id |
string (uuid) | Id unique (UUID). |
title |
string | Titre de la tâche. |
description |
string | Description. peut être vide (null) |
status |
string | open, in_progress (en cours), completed (terminée) ou cancelled (annulée) ; découle de la colonne. l'une des valeurs : open, in_progress, completed, cancelled |
priority |
string | low, normal (par défaut), high ou urgent. l'une des valeurs : low, normal, high, urgent |
due_date |
string (date) | Échéance au format AAAA-MM-JJ, ou null. peut être vide (null) |
board_id |
string (uuid) | Le tableau sur lequel se trouve la tâche. peut être vide (null) |
status_id |
string (uuid) | La colonne du tableau. Facultatif à la création ; sans colonne : la colonne ouverte du tableau par défaut. peut être vide (null) |
assigned_user_id |
string | L’utilisateur qui réalise la tâche, ou null. peut être vide (null) |
links |
array<object> | Les enregistrements auxquels la tâche appartient (20 au maximum). |
links.object |
string | Type d’enregistrement : customer, deal, appointment, work_order, quote ou invoice. l'une des valeurs : customer, deal, appointment, work_order, quote, invoice |
links.id |
string (uuid) | Id (UUID) de l’enregistrement. |
has_open_actions |
boolean | Reste-t-il des actions ouvertes sur la tâche ? Elle ne peut alors pas être terminée. |
labels |
array<object> | Les étiquettes propres à la tâche, comme CHAUD ou PROFESSIONNEL. Modifiez-les avec POST /tasks/{id}/labels. |
labels.object |
string | Toujours « deal_label ». |
labels.id |
string (uuid) | Id de l'étiquette. |
labels.name |
string | Nom de l'étiquette. |
labels.color |
string | Couleur (hex). |
labels.group |
string | Les étiquettes d'un même groupe s'excluent ; null = se combine avec tout. peut être vide (null) |
deal_id |
string (uuid) | Le deal (carte du pipeline) auquel la tâche appartient : un deal lié, le deal d'un devis, rendez-vous, facture ou bon de travail lié, ou le deal ouvert du client. Null s'il n'y en a pas. peut être vide (null) |
deal_labels |
array<object> | Les étiquettes du deal auquel la tâche appartient (deal_id), à titre d’information. Modifiez-les sur le deal (POST /deals/{id}/labels). |
deal_labels.object |
string | Toujours "deal_label". |
deal_labels.id |
string (uuid) | Id de l’étiquette. |
deal_labels.name |
string | Nom de l’étiquette. |
deal_labels.color |
string | Couleur (hex). |
deal_labels.group |
string | Les étiquettes d’un même groupe s’excluent ; null = se combine avec tout. peut être vide (null) |
completed_at |
string (date-time) | Date à laquelle la tâche a été terminée. peut être vide (null) |
cancelled_at |
string (date-time) | Date à laquelle la tâche a été annulée. peut être vide (null) |
created_at |
string (date-time) | Créée le (UTC). |
updated_at |
string (date-time) | Dernière modification (UTC). |