API REST
Des scripts, des intégrations et d'autres outils hors de Jira peuvent lire et modifier les hiérarchies TreeCraft grâce à l'API REST de l'application. Cette page s'adresse aux développeurs qui les créent. Elle explique comment activer l'API et obtenir un jeton, puis présente les portées, chaque point de terminaison et les règles que suit chaque appel.
Dans cette page
À quoi sert l'API
L'API permet à un programme de faire ce qu'une personne fait dans les pages de l'application, en son nom. Par exemple, elle peut :
- lister les hiérarchies qu'une personne peut ouvrir, et lire leurs lignes ;
- garder une hiérarchie synchronisée avec un autre outil, en ajoutant, en déplaçant et en retirant des lignes ;
- créer, renommer, archiver ou supprimer des hiérarchies ;
- lire les règles d'une hiérarchie et les vues enregistrées.
Chaque appel agit au nom de la personne qui l'a autorisé, avec les mêmes vérifications que les pages de l'application :
- son niveau d'accès sur la hiérarchie : Consulter, Modifier, Automatiser ou Contrôler ;
- les réglages Accès à l'app et Droits d'automatisation du site ;
- ses permissions Jira sur chaque ticket.
Une ligne ne montre jamais un ticket que la personne ne peut pas voir dans Jira. L'API renvoie l'identifiant des tickets, pas leurs champs : lisez les tickets eux-mêmes avec l'API REST de Jira et le même jeton, pour que les permissions de Jira s'y appliquent aussi.
Il s'agit de la version 1, en bêta. L'API repose sur les API REST d'applications Forge, qu'Atlassian propose en préversion. Atlassian peut les modifier avec un préavis plus court que d'habitude : l'API reste donc en bêta tant qu'elles ne sont pas offertes à tous.
Elle fonctionne sur Atlassian
Les appels passent par la passerelle d'API d'Atlassian jusqu'à l'application, qui fonctionne sur le nuage d'Atlassian comme le reste de TreeCraft. L'application n'envoie aucune donnée hors d'Atlassian. Ce que l'API conserve, par exemple la trace d'un appel répété, reste dans le stockage de l'application chez Atlassian, avec le reste des données du site. Avec l'API activée, TreeCraft reste conçu selon les exigences du programme Runs on Atlassian.
La passerelle vérifie le jeton et ses portées avant que l'appel n'atteigne l'application. Un jeton qui n'a pas la portée exigée par une route n'atteint jamais TreeCraft.
Activer l'API
Deux interrupteurs doivent être activés pour qu'un appel atteigne l'application. Les deux appartiennent au site, et désactiver l'un ou l'autre arrête aussitôt tous les appels.
La première version de TreeCraft qui comprend l'API est une mise à jour majeure de l'application. Un administrateur du site approuve cette mise à jour une fois avant que l'API ne soit disponible.
L'interrupteur d'Atlassian
L'interrupteur d'Atlassian est désactivé par défaut. Un administrateur du site ou de l'organisation l'active :
- Dans Atlassian Administration, sélectionnez votre organisation.
- Sous Applications, allez dans Sites et sélectionnez le site où TreeCraft est installé.
- Sélectionnez Applications connectées, trouvez TreeCraft et ouvrez les détails de l'application.
- Dans l'onglet Détails, activez App REST APIs.
L'interrupteur de TreeCraft
L'interrupteur de TreeCraft est activé par défaut. Les administrateurs Jira et les administrateurs de l'application le trouvent dans les paramètres de l'application, dans l'administration de Jira sous Applications : sélectionnez API REST dans le groupe Accès. La page présente :
- Autoriser les appels à l'API REST de cette application sur ce site, l'interrupteur. Une modification s'applique à tous les appels en moins d'une minute. Tant qu'il est désactivé, chaque appel répond
403 API_TURNED_OFF. - URL de base, sous ses deux formes, remplies pour votre site, chacune avec un bouton de copie.
- Identifiants : l'identifiant de l'application, l'identifiant de l'environnement et l'identifiant cloud.
- Portées : les trois portées et ce que chacune permet.
Obtenir un jeton d'accès
L'API accepte un jeton d'accès OAuth 2.0 (3LO). Un jeton appartient à une personne, et chaque appel fait avec lui agit en son nom. Seuls les membres du site où TreeCraft est installé peuvent configurer l'intégration. Les libellés de l'Atlassian Developer Console sont donnés ici en anglais.
- Ouvrez l'Atlassian Developer Console. Sélectionnez Create, puis OAuth 2.0 integration, et nommez l'intégration.
- Sous Permissions, sélectionnez Add Marketplace or custom app. Choisissez votre site, puis TreeCraft, puis les portées dont votre intégration a besoin. Ne choisissez que celles-là.
- Ajoutez aussi la portée Jira
read:forge-app:jira. Tout appel à l'API REST d'une application l'exige. - Sous Authorization, indiquez une URL de rappel. La console affiche alors une URL d'autorisation.
- Vérifiez que le paramètre
scopede cette URL contient les portées TreeCraft etread:forge-app:jira. Ajoutezoffline_accesspour obtenir un jeton d'actualisation. Ajoutez à la main toute portée manquante, en les séparant par%20. - Ouvrez l'URL, choisissez le site et sélectionnez Accept. Atlassian vous renvoie vers l'URL de rappel avec un
code. - Échangez ce code contre un jeton, comme le montre l'exemple ci-dessous.
Une URL d'autorisation qui demande la portée de lecture ressemble à ceci :
https://auth.atlassian.com/authorize?audience=api.atlassian.com&client_id=YOUR_CLIENT_ID&scope=read%3Ahierarchy%3Acustom%20read%3Aforge-app%3Ajira%20offline_access&redirect_uri=YOUR_CALLBACK&state=RANDOM&response_type=code&prompt=consent
Échangez le code contre un jeton de cette façon :
curl -s -X POST https://auth.atlassian.com/oauth/token \
-H 'Content-Type: application/json' \
-d '{"grant_type":"authorization_code","client_id":"YOUR_CLIENT_ID","client_secret":"YOUR_CLIENT_SECRET","code":"THE_CODE","redirect_uri":"YOUR_CALLBACK"}'
La réponse contient access_token, de courte durée, et refresh_token si vous avez demandé offline_access. Pour obtenir un nouveau jeton d'accès, envoyez le jeton d'actualisation à la place du code :
curl -s -X POST https://auth.atlassian.com/oauth/token \
-H 'Content-Type: application/json' \
-d '{"grant_type":"refresh_token","client_id":"YOUR_CLIENT_ID","client_secret":"YOUR_CLIENT_SECRET","refresh_token":"THE_REFRESH_TOKEN"}'
Envoyez le jeton à chaque appel, dans l'en-tête Authorization :
curl -s "$BASE/v1/hierarchies" -H "Authorization: Bearer $TOKEN" -H 'Accept: application/json'
Si le jeton n'a pas la portée exigée par une route, la passerelle d'Atlassian refuse l'appel avec 401 Unauthorized; scope does not match.
URL de base
Deux formes d'URL de base mènent à la même API :
https://api.atlassian.com/svc/jira/<cloud-id>/apps/<app-id>_<environment-id>
https://<your-site>.atlassian.net/gateway/api/svc/jira/apps/<app-id>_<environment-id>
Les parties entre chevrons sont à remplacer. Vos propres valeurs figurent dans la page API REST de TreeCraft, qui affiche les deux URL déjà remplies, prêtes à copier.
| Partie | Où la trouver |
|---|---|
cloud-id |
Les Identifiants de la page API REST de TreeCraft. Vous pouvez aussi ouvrir https://<your-site>.atlassian.net/_edge/tenant_info, ou appeler GET https://api.atlassian.com/oauth/token/accessible-resources avec un jeton : la réponse liste les sites qu'il peut atteindre, avec leurs identifiants. |
app-id |
Les Identifiants de la page API REST de TreeCraft. |
environment-id |
Les Identifiants de la page API REST de TreeCraft. |
your-site |
L'adresse de votre site, comme dans your-site.atlassian.net. |
Une fois l'interrupteur d'Atlassian activé, Atlassian Administration affiche aussi l'URL de base sous App REST APIs.
Les exemples de cette page utilisent deux variables du shell :
BASE='https://api.atlassian.com/svc/jira/<cloud-id>/apps/<app-id>_<environment-id>'
TOKEN='<access-token>'
Portées
TreeCraft a trois portées. Chaque point de terminaison exige exactement l'une d'elles.
| Portée | Permet à l'intégration de |
|---|---|
read:hierarchy:custom |
Lire les hiérarchies que la personne peut ouvrir : leurs détails, leurs lignes et leurs règles, ainsi que les vues que la personne peut utiliser. Ne modifie rien. |
write:hierarchy:custom |
Ajouter des tickets et des dossiers, et déplacer ou retirer des lignes, dans les hiérarchies que la personne peut modifier. Ne modifie aucun ticket Jira. |
manage:hierarchy:custom |
Créer des hiérarchies, et renommer, étiqueter, archiver, restaurer ou supprimer celles que la personne contrôle. |
Une portée ne donne jamais plus que ce que la personne a déjà. Une intégration qui modifie des lignes demande d'habitude aussi read:hierarchy:custom, pour lire ce qu'elle modifie. Chaque appel exige en plus la portée Jira read:forge-app:jira.
Points de terminaison
Chaque chemin commence par la version, /v1. {id} est l'identifiant d'une hiérarchie et {viewId} celui d'une vue. Le niveau est le niveau d'accès de la personne sur la hiérarchie. Chaque appel exige aussi qu'Accès à l'app permette à la personne d'utiliser l'application.
| Méthode | Chemin | Portée | Permission TreeCraft |
|---|---|---|---|
GET |
/v1/hierarchies |
read:hierarchy:custom |
Ne liste que les hiérarchies où la personne a Consulter ou plus |
POST |
/v1/hierarchies |
manage:hierarchy:custom |
Accès à l'app permet à la personne de créer des hiérarchies |
GET |
/v1/hierarchies/{id} |
read:hierarchy:custom |
Consulter |
PATCH |
/v1/hierarchies/{id} |
manage:hierarchy:custom |
Contrôler |
DELETE |
/v1/hierarchies/{id} |
manage:hierarchy:custom |
Contrôler |
GET |
/v1/hierarchies/{id}/rows |
read:hierarchy:custom |
Consulter |
POST |
/v1/hierarchies/{id}/rows/batch |
write:hierarchy:custom |
Modifier, et Automatiser pour déplacer ou retirer des règles |
GET |
/v1/hierarchies/{id}/rules |
read:hierarchy:custom |
Automatiser |
GET |
/v1/views |
read:hierarchy:custom |
Aucun niveau sur une hiérarchie : les vues de la personne et les vues partagées qu'elle peut utiliser |
GET |
/v1/views/{viewId} |
read:hierarchy:custom |
Aucun niveau sur une hiérarchie : une vue de la personne, ou une vue partagée qu'elle peut utiliser |
Une hiérarchie que la personne ne peut pas ouvrir répond 404, comme une hiérarchie qui n'existe pas. Un niveau trop bas répond 403.
Lister les hiérarchies
GET /v1/hierarchies · Portée : read:hierarchy:custom · Exige : Consulter sur chaque hiérarchie listée
Liste les hiérarchies que la personne peut ouvrir, par ordre d'identifiant, une page à la fois.
| Paramètre | Emplacement | Description |
|---|---|---|
limit |
requête | De 1 à 500. 100 par défaut. |
cursor |
requête | Le nextCursor de la page précédente. |
includeArchived |
requête | true pour inclure les hiérarchies archivées. false par défaut. |
label |
requête | Seulement les hiérarchies qui portent cette étiquette, sans tenir compte de la casse. |
curl -s "$BASE/v1/hierarchies?limit=2" -H "Authorization: Bearer $TOKEN"
{
"hierarchies": [
{ "id": 12, "name": "Plan de livraison", "description": "", "ownerAccountId": "5b10ac8d82e05b22cc7d4ef5", "access": "control",
"archived": false, "version": 48, "labels": ["Planification"], "favorite": true, "searchable": false },
{ "id": 15, "name": "Demandes de support", "description": "Demandes ouvertes par équipe", "ownerAccountId": "5b10ac8d82e05b22cc7d4ef5",
"access": "view", "archived": false, "version": 7, "labels": [], "favorite": false, "searchable": true }
],
"nextCursor": "aDoxNQ"
}
Chaque hiérarchie a ces champs :
| Champ | Signification |
|---|---|
id |
L'identifiant de la hiérarchie. |
name, description |
Son nom et sa description. |
ownerAccountId |
L'identifiant de compte Atlassian de son propriétaire. |
access |
Le niveau de la personne sur cette hiérarchie : view (Consulter), edit (Modifier), automate (Automatiser) ou control (Contrôler). |
archived |
true si elle est archivée. |
version |
Augmente à chaque modification de ses lignes. |
labels |
Ses étiquettes. |
favorite |
true si elle fait partie des favoris de la personne. |
searchable |
true si ses tickets peuvent être trouvés par la recherche Jira. |
Créer une hiérarchie
POST /v1/hierarchies · Portée : manage:hierarchy:custom · Exige : Accès à l'app permet à la personne de créer des hiérarchies
Crée une hiérarchie. La personne en devient propriétaire, avec Contrôler, et la hiérarchie s'ajoute à ses favoris. Comme toute nouvelle hiérarchie, elle est privée au départ.
| Champ | Emplacement | Description |
|---|---|---|
name |
corps | Obligatoire. Jusqu'à 255 caractères. |
description |
corps | Jusqu'à 20 000 caractères. |
Idempotency-Key |
en-tête | Facultatif. Voir Idempotence. |
curl -s -X POST "$BASE/v1/hierarchies" -H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' -H 'Idempotency-Key: creer-plan-livraison-1' \
-d '{"name":"Plan de livraison","description":"Tout ce qui est prévu pour la prochaine version"}'
Répond 201 avec la nouvelle hiérarchie :
{ "id": 21, "name": "Plan de livraison", "description": "Tout ce qui est prévu pour la prochaine version", "ownerAccountId": "5b10ac8d82e05b22cc7d4ef5",
"access": "control", "archived": false, "version": 0, "labels": [], "favorite": true, "searchable": false }
Obtenir une hiérarchie
GET /v1/hierarchies/{id} · Portée : read:hierarchy:custom · Exige : Consulter
Lit les détails d'une hiérarchie. Cet appel coûte peu : c'est un bon moyen de vérifier version avant de relire les lignes.
| Paramètre | Emplacement | Description |
|---|---|---|
id |
chemin | L'identifiant de la hiérarchie. |
curl -s "$BASE/v1/hierarchies/12" -H "Authorization: Bearer $TOKEN"
Répond 200 avec la hiérarchie, avec les mêmes champs que dans la liste :
{ "id": 12, "name": "Plan de livraison", "description": "", "ownerAccountId": "5b10ac8d82e05b22cc7d4ef5", "access": "control",
"archived": false, "version": 48, "labels": ["Planification"], "favorite": true, "searchable": false }
Modifier une hiérarchie
PATCH /v1/hierarchies/{id} · Portée : manage:hierarchy:custom · Exige : Contrôler
Renomme une hiérarchie, change sa description ou ses étiquettes, l'archive ou la restaure. Donnez au moins un champ.
Les champs s'appliquent l'un après l'autre, comme dans l'application. Une erreur 400 pour un name ou une description incorrects peut donc arriver alors que les étiquettes (labels) de la même demande ont déjà été modifiées. Quand cela compte, envoyez un seul champ à la fois.
| Champ | Emplacement | Description |
|---|---|---|
id |
chemin | L'identifiant de la hiérarchie. |
name |
corps | Jusqu'à 255 caractères. |
description |
corps | Jusqu'à 20 000 caractères. |
labels |
corps | Jusqu'à 10 étiquettes, de 40 caractères au plus chacune. Remplacent les étiquettes actuelles. |
archived |
corps | true archive la hiérarchie, false la restaure. |
Idempotency-Key |
en-tête | Facultatif. Voir Idempotence. |
curl -s -X PATCH "$BASE/v1/hierarchies/12" -H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' -d '{"name":"Plan de livraison 2027","labels":["Planification","2027"]}'
Répond 200 avec la hiérarchie telle qu'elle est maintenant :
{ "id": 12, "name": "Plan de livraison 2027", "description": "", "ownerAccountId": "5b10ac8d82e05b22cc7d4ef5", "access": "control",
"archived": false, "version": 48, "labels": ["Planification", "2027"], "favorite": true, "searchable": false }
Supprimer une hiérarchie
DELETE /v1/hierarchies/{id} · Portée : manage:hierarchy:custom · Exige : Contrôler
Supprime la hiérarchie avec ses lignes, ses règles et ses écritures en retour. Les tickets Jira ne changent pas. La suppression est définitive.
| Paramètre | Emplacement | Description |
|---|---|---|
id |
chemin | L'identifiant de la hiérarchie. |
Idempotency-Key |
en-tête | Facultatif. Voir Idempotence. |
curl -s -X DELETE "$BASE/v1/hierarchies/12" -H "Authorization: Bearer $TOKEN"
Répond 204, sans corps.
Lire les lignes
GET /v1/hierarchies/{id}/rows · Portée : read:hierarchy:custom · Exige : Consulter
Lit l'arbre, ou la partie qui se trouve sous une ligne. Les lignes arrivent dans l'ordre où la grille les affiche sans tri : chaque ligne, puis les lignes qui se trouvent sous elle.
| Paramètre | Emplacement | Description |
|---|---|---|
id |
chemin | L'identifiant de la hiérarchie. |
under |
requête | L'identifiant d'une ligne. Seulement les lignes qui se trouvent sous elle. |
depth |
requête | Nombre de niveaux sous le point de départ, de 1 à 64. 64 par défaut. 1 ne donne que le premier niveau, ou que les enfants de under. |
limit |
requête | De 1 à 5 000. 1 000 par défaut. |
cursor |
requête | Le nextCursor de la page précédente. |
curl -s "$BASE/v1/hierarchies/12/rows?depth=2&limit=5000" -H "Authorization: Bearer $TOKEN"
{
"hierarchyId": 12,
"version": 48,
"building": false,
"limitsReached": [],
"rows": [
{ "id": 4711, "parentId": null, "level": 1, "kind": "issue", "byRule": false, "hasChildren": true, "issueId": "10001" },
{ "id": 4712, "parentId": 4711, "level": 2, "kind": "folder", "byRule": false, "hasChildren": false, "folderId": "7", "name": "Trimestre prochain" },
{ "id": 4713, "parentId": 4711, "level": 2, "kind": "restricted", "byRule": false, "hasChildren": true },
{ "id": 4800, "parentId": null, "level": 1, "kind": "group", "byRule": true, "hasChildren": true, "groupId": "status:3", "label": "En cours" }
],
"nextCursor": null
}
Chaque ligne a ces champs :
| Champ | Signification |
|---|---|
id |
L'identifiant de la ligne. |
parentId |
La ligne au-dessus d'elle, ou null au premier niveau. |
level |
1 correspond au niveau situé juste sous le point de départ. |
kind |
Ce que la ligne affiche (voir le tableau suivant). |
byRule |
true si une règle a placé la ligne. C'est la règle qui décide où elle va. |
hasChildren |
true si des lignes se trouvent sous elle. Lisez-les plus tard avec under. |
Puis, selon le type :
kind |
Champs |
|---|---|
issue |
issueId. Lisez le ticket lui-même avec l'API REST de Jira et votre propre jeton. |
folder |
folderId, name. |
planningItem |
planningItemId, name, estimateHours, ownerAccountId. |
memo |
memoId, text (en balisage wiki), revision. |
group |
groupId, label. |
rule |
ruleId. Seules les personnes ayant Automatiser voient les lignes de règle. |
restricted |
Rien d'autre. Un ticket que la personne ne peut pas voir, placé à la main au-dessus de lignes qu'elle peut voir. Voir Ce que l'API ne montre jamais. |
La réponse contient aussi :
version: la version de la hiérarchie au moment où la page a été lue.building:truependant la reconstruction des résultats des règles. Relisez un peu plus tard pour obtenir les lignes les plus récentes.limitsReached: les limites des règles qui ont coupé les résultats des règles, sous les noms qu'emploie l'avis de l'application.
Chaque page relit l'arbre : demandez donc de grandes pages. Une hiérarchie de 20 000 lignes se lit en 4 appels de 5 000.
Modifier les lignes
POST /v1/hierarchies/{id}/rows/batch · Portée : write:hierarchy:custom · Exige : Modifier, et Automatiser pour déplacer ou retirer des règles
Ajoute, déplace et retire des lignes en un seul lot. L'application vérifie d'abord le lot entier, puis l'écrit en une seule modification, ou pas du tout. C'est la même modification, avec les mêmes vérifications, qu'une modification faite dans l'application.
| Champ | Emplacement | Description |
|---|---|---|
id |
chemin | L'identifiant de la hiérarchie. |
changes |
corps | Obligatoire. De 1 à 200 changements, appliqués dans l'ordre. |
Idempotency-Key |
en-tête | Facultatif. Voir Idempotence. |
Chaque changement a une action :
action |
Champs |
|---|---|
add |
items : chaque élément est {"issueId": "10001"}, {"folderId": "7"} pour un dossier existant, ou {"folderName": "Nouveau dossier"} pour un nouveau dossier que l'application crée pour vous. parentId : la ligne sous laquelle ajouter (null ou absent : le premier niveau). afterId : la ligne sœur après laquelle ajouter (null ou absent : en premier). |
move |
rowIds, parentId, afterId. |
remove |
rowIds. keepChildren : true remonte les lignes situées sous chaque ligne retirée à sa place. Par défaut, elles sont retirées avec elle. |
curl -s -X POST "$BASE/v1/hierarchies/12/rows/batch" -H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' -H 'Idempotency-Key: sync-2026-10-24-0900' \
-d '{"changes":[
{"action":"add","parentId":null,"afterId":4711,"items":[{"issueId":"10001"},{"folderName":"Trimestre prochain"}]},
{"action":"move","rowIds":[4712],"parentId":4800,"afterId":null},
{"action":"remove","rowIds":[4713],"keepChildren":true}]}'
{
"hierarchyId": 12,
"version": 49,
"added": [
{ "changeIndex": 0, "rowId": 6620417819, "kind": "issue", "issueId": "10001" },
{ "changeIndex": 0, "rowId": 2299815532, "kind": "folder", "folderId": "8" }
],
"removedRowIds": [4713]
}
added liste les nouvelles lignes, avec l'indice du changement qui a ajouté chacune. C'est l'application qui choisit l'identifiant des nouvelles lignes. removedRowIds ne liste que les lignes que la personne pouvait voir.
- La personne doit pouvoir voir chaque ligne que le lot nomme, les lignes au-dessus d'elle et chaque ticket qu'il ajoute. Sinon, le lot répond
403et ne modifie rien. - Une ligne qui n'existe plus répond
409 CONFLICT. - Un lot compte au plus 200 changements, 2 000 lignes et 50 nouveaux dossiers.
- Une hiérarchie contient au plus 20 000 tickets.
- Les lignes que la personne ne peut pas voir sous une ligne retirée restent où elles étaient, comme dans l'application.
- Les nouveaux dossiers indiqués par
folderNamesont créés avant que la modification ne soit écrite. Si le lot est refusé, ils sont supprimés de nouveau. - Les modifications dans les résultats des règles exigent le paramètre de la hiérarchie qui les permet. Voir Modifications dans le résultat des règles.
- Une hiérarchie qui a des règles reconstruit ensuite leurs résultats, en arrière-plan.
Lister les règles
GET /v1/hierarchies/{id}/rules · Portée : read:hierarchy:custom · Exige : Automatiser
Liste les règles de la hiérarchie dans l'ordre de l'arbre, avec leurs paramètres. Il faut Automatiser, comme pour les paramètres des règles dans l'application.
| Paramètre | Emplacement | Description |
|---|---|---|
id |
chemin | L'identifiant de la hiérarchie. |
curl -s "$BASE/v1/hierarchies/12/rules" -H "Authorization: Bearer $TOKEN"
{
"hierarchyId": 12,
"version": 48,
"building": false,
"limitsReached": [],
"rules": [
{ "ruleId": "31", "rowId": 4800, "parentId": null, "position": 0, "type": "insertJql", "settings": { "type": "insertJql", "jql": "project = REL" } }
]
}
Chaque règle a son ruleId, son rowId dans l'arbre, son parentId, sa position parmi ses sœurs (à partir de 0), son type et ses settings tels que l'application les conserve. Les versions suivantes pourront ajouter des champs à settings.
Lister les vues
GET /v1/views · Portée : read:hierarchy:custom · Exige : aucun niveau sur une hiérarchie
Liste toutes les vues de la personne et jusqu'à 100 vues partagées qu'elle peut utiliser.
| Paramètre | Emplacement | Description |
|---|---|---|
search |
requête | Restreint les vues partagées par leur nom. Jusqu'à 100 caractères. |
curl -s "$BASE/v1/views?search=livraison" -H "Authorization: Bearer $TOKEN"
{
"views": [
{ "id": 4, "name": "Colonnes de livraison", "mine": true, "shared": true, "editable": true,
"columns": [ { "id": "c1", "type": "field", "field": "status" } ], "wrap": false }
],
"moreShared": false
}
mine vaut true pour les vues de la personne, shared pour les vues partagées avec d'autres, et editable quand la personne peut modifier la vue dans l'application. columns liste ses colonnes dans l'ordre, telles que l'application les conserve. moreShared vaut true quand il existe plus de vues partagées que celles listées : cherchez-les par leur nom.
Obtenir une vue
GET /v1/views/{viewId} · Portée : read:hierarchy:custom · Exige : aucun niveau sur une hiérarchie
Lit une vue : une vue de la personne, ou une vue partagée qu'elle peut utiliser. Toute autre vue répond 404.
| Paramètre | Emplacement | Description |
|---|---|---|
viewId |
chemin | L'identifiant de la vue. |
curl -s "$BASE/v1/views/4" -H "Authorization: Bearer $TOKEN"
{ "id": 4, "name": "Colonnes de livraison", "mine": true, "shared": true, "editable": true,
"columns": [ { "id": "c1", "type": "field", "field": "status" } ], "wrap": false }
Ce que l'API ne montre jamais
- Les tickets que la personne ne peut pas voir dans Jira. Les lignes placées par des règles que la personne ne peut pas voir sont laissées de côté, avec tout ce qui se trouve sous elles. Un ticket placé à la main que la personne ne peut pas voir apparaît comme une ligne
restrictedseulement là où il contient des lignes qu'elle peut voir. Cette ligne ne dit rien du ticket. La règle vaut pour tout le monde, administrateurs de l'application compris. - Les champs des tickets. L'API renvoie l'identifiant des tickets. Lisez les tickets avec l'API REST de Jira et le même jeton.
- Les adresses courriel. Les personnes n'apparaissent que par leur identifiant de compte Atlassian.
- Les règles et leurs paramètres, pour les personnes qui n'ont pas Automatiser sur la hiérarchie.
Erreurs
Toutes les erreurs ont la même forme :
{ "error": { "status": 409, "code": "CONFLICT", "message": "row no longer exists" } }
Le message est toujours en anglais.
| Statut | Code | Signification et marche à suivre |
|---|---|---|
| 400 | INVALID_REQUEST |
Un paramètre ou le corps est incorrect. Le message dit lequel. |
| 401 | UNAUTHENTICATED |
L'appel est arrivé sans le compte d'une personne, ou le compte au nom duquel l'appel agit dans Jira n'a pas pu être confirmé. Utilisez le jeton 3LO d'une personne. |
| 401 | IDENTITY_MISMATCH |
Atlassian a nommé plus d'un compte ou d'un site Jira pour l'appel, ou Jira a nommé un autre compte pour le jeton. Obtenez un nouveau jeton. |
| 401 | REAUTHORIZE |
La personne doit autoriser l'application de nouveau : elle ouvre TreeCraft une fois dans Jira et autorise l'accès. |
| 403 | FORBIDDEN |
Le niveau de la personne sur la hiérarchie, Accès à l'app ou les Droits d'automatisation ne le permettent pas. Le message dit lequel. |
| 403 | API_TURNED_OFF |
Un administrateur a désactivé l'interrupteur de TreeCraft pour ce site. Voir Activer l'API. |
| 403 | JIRA_REFUSED |
Jira a refusé une demande que l'application a faite au nom de la personne. Le message de Jira suit. Quand Jira refuse une demande que l'application fait en son propre nom, la réponse est plutôt 500 INTERNAL, sans le message de Jira. |
| 404 | NOT_FOUND |
Aucune hiérarchie, ligne ou vue de ce nom, ou une que la personne ne peut pas voir. |
| 409 | CONFLICT |
Une ligne a changé depuis votre lecture. Relisez, puis réessayez. |
| 409 | CURSOR_STALE |
La ligne à partir de laquelle une page continue n'existe plus. Reprenez la lecture à la première page. |
| 409 | IDEMPOTENCY_IN_PROGRESS |
Un appel avec la même Idempotency-Key est encore en cours. Attendez retryAfterSeconds, puis réessayez avec la même clé. |
| 409 | IDEMPOTENCY_UNFINISHED |
Un appel avec la même Idempotency-Key s'est terminé sans réponse, après avoir peut-être modifié quelque chose. Lisez la hiérarchie pour savoir si la modification a pris effet. Si ce n'est pas le cas, utilisez une nouvelle clé. Réessayer avec cette clé donne la même réponse. |
| 422 | IDEMPOTENCY_KEY_REUSED |
La Idempotency-Key a servi pour une autre demande. Utilisez une nouvelle clé. |
| 429 | RATE_LIMITED |
Les limites de débit de l'API sont dépassées. Attendez retryAfterSeconds. |
| 429 | JIRA_BUSY |
Jira limite les requêtes de l'application sur ce site. Attendez retryAfterSeconds. |
| 500 | INTERNAL |
Un problème est survenu dans l'application. Réessayez. S'il persiste, écrivez au support en donnant l'heure de l'appel. |
| 502 | JIRA_ERROR |
Jira n'a pas répondu correctement, ou n'a pas pu être joint au nom de la personne (une erreur réseau, un délai dépassé, la plateforme d'Atlassian qui fait échouer la demande). Réessayez après retryAfterSeconds. |
| 503 | BUSY |
La hiérarchie ou la base de données de l'application est occupée. Réessayez après retryAfterSeconds. |
| 503 | UPDATING |
L'application applique une mise à jour. Réessayez dans une minute. |
Les réponses 429, 502 et 503, ainsi que 409 IDEMPOTENCY_IN_PROGRESS, portent retryAfterSeconds dans le corps et un en-tête Retry-After, tous deux en secondes.
Un jeton qui n'a pas la portée exigée par une route est refusé par la passerelle d'Atlassian, avant l'application, avec 401 Unauthorized; scope does not match. Cette réponse n'a pas la forme ci-dessus.
Pagination
Les listes renvoient une page et un nextCursor. Renvoyez-le comme cursor pour obtenir la page suivante, jusqu'à ce que nextCursor vaille null. Les curseurs sont opaques : ne les construisez pas et ne les modifiez pas.
| Liste | Page par défaut | Page la plus grande |
|---|---|---|
GET /v1/hierarchies |
100 hiérarchies | 500 |
GET /v1/hierarchies/{id}/rows |
1 000 lignes | 5 000 |
Si la ligne à partir de laquelle une page continue n'existe plus, la réponse est 409 CURSOR_STALE. Reprenez à la première page.
Limites de débit
| Limite | Valeur |
|---|---|
| Requêtes par personne | 120 par minute |
| Requêtes par site, tous les appelants ensemble | 1 000 par minute |
| Changements dans un lot | 200, avec 2 000 lignes et 50 nouveaux dossiers |
| Corps de la requête | 800 ko |
Au-delà d'une limite, la réponse est 429 RATE_LIMITED avec retryAfterSeconds. Atlassian applique en plus ses propres limites de débit aux API REST des applications.
Chaque appel s'exécute aussi sur l'instance de l'application de votre site. Ce qu'il demande à Jira compte dans l'allocation horaire de points de l'API Jira de l'application sur votre site, que les pages de l'application partagent. Lire les lignes coûte à peu près autant qu'ouvrir la hiérarchie dans l'application. Pour limiter ce coût :
- lisez par grandes pages ;
- vérifiez la
versiond'une hiérarchie avecGET /v1/hierarchies/{id}, et ne relisez ses lignes que si elle a changé ; - n'interrogez pas l'API plus souvent que nécessaire.
Idempotence
POST, PATCH et DELETE acceptent un en-tête facultatif Idempotency-Key : de 1 à 64 lettres, chiffres, - et _. Il rend une nouvelle tentative sans risque.
- La même clé avec la même demande dans les 24 heures renvoie la première réponse, avec l'en-tête
Idempotent-Replayed: true. Rien n'est fait deux fois. - La même clé avec une autre demande répond
422 IDEMPOTENCY_KEY_REUSED. - La même clé pendant que le premier appel est encore en cours répond
409 IDEMPOTENCY_IN_PROGRESSavecRetry-After. Attendez, puis réessayez avec la même clé. - Une première tentative qui a échoué avec
401,429ou une erreur5xxavant de modifier quoi que ce soit ne laisse aucune trace : une nouvelle tentative avec la même clé l'exécute. Après un401, réessayez une fois que la personne s'est connectée ou a autorisé l'application de nouveau. - Une première tentative qui a échoué après avoir modifié quelque chose garde sa clé. Une nouvelle tentative avec cette clé répond
409 IDEMPOTENCY_IN_PROGRESSpendant la première minute, puis409 IDEMPOTENCY_UNFINISHED: la première tentative s'est terminée sans réponse. Lisez la hiérarchie pour savoir si la modification a pris effet. Si ce n'est pas le cas, utilisez une nouvelle clé. - Une réponse renvoyée est la première réponse que la personne a elle-même reçue pour cette demande, telle quelle. Elle n'est pas vérifiée de nouveau par rapport à ses accès.
Utilisez une nouvelle clé pour chaque modification que vous voulez faire, et la même clé pour réessayer cette modification. Sans clé, un POST réessayé peut faire son travail deux fois : une deuxième hiérarchie, ou des lignes ajoutées deux fois.
Gestion des versions
- Les chemins portent la version :
/v1. Dans la v1, les changements ne font qu'ajouter : nouveaux champs, paramètres facultatifs et nouveaux points de terminaison. Ignorez les champs que vous ne connaissez pas. - Un changement qui casserait les appelants crée
/v2. La v1 continue de fonctionner au moins 12 mois après la sortie de la v2. Pendant ce temps, ses réponses portent les en-têtesDeprecationetSunset. - Les portées gardent leur sens. Une nouvelle portée oblige chaque intégration à redemander le consentement de ses utilisateurs.
Historique des versions
| Version | Date | Changement |
|---|---|---|
| 1.0.0-beta | Octobre 2026 | Première version, en bêta : hiérarchies (lister, obtenir, créer, modifier, supprimer), lignes (lire, modifier par lots), règles (lister) et vues (lister, obtenir). |
Prévu ensuite, sans ordre promis : les valeurs calculées des colonnes d'une vue, les clés des tickets dans les lignes, la modification des règles, les mémos et les éléments de planification, l'historique et les requêtes d'arbre.
Des questions sur l’application? Écrivez à info@plugincraft.ca.