{"openapi":"3.1.0","info":{"title":"API publique de Synkro","version":"1.0.0","description":"API REST de Synkro pour les intégrations (scripts, Zapier, Make, n8n). Authentification par clé d'API : `Authorization: Bearer syk_key_…`, jamais dans l'adresse. JSON UTF-8, champs en snake_case, dates ISO 8601 en UTC. Corps de requête de 1 Mio au plus. Aucune réponse CORS : une requête qui porte un en-tête `Origin` reçoit `403`. `/v1` ne reçoit que des ajouts de champs, de routes et de valeurs d'énumération. Un chemin inconnu répond `404 not_found`, une méthode non prévue sur un chemin connu `405 method_not_allowed` avec l'en-tête `Allow`. Chaque réponse porte `Synkro-Request-Id` ; une réponse authentifiée porte aussi `RateLimit-Limit`, `RateLimit-Remaining` et `RateLimit-Reset`. Les listes renvoient `{ data, next_cursor }` ; le curseur est opaque et `next_cursor` vaut `null` à la dernière page. Les listes d'une seule page (personnes d'un canal, membres, abonnements) ont toujours `next_cursor` à `null`."},"servers":[{"url":"https://integrations.mysynkro.fr/v1"}],"security":[{"bearerAuth":[]}],"paths":{"/me":{"get":{"operationId":"getMe","summary":"L'intégration de la clé","description":"Renvoie l'intégration à laquelle la clé appartient, ses portées, ses canaux ouverts et son titulaire. Sert à vérifier une clé.","responses":{"200":{"description":"L'intégration.","headers":{"Synkro-Request-Id":{"$ref":"#/components/headers/Synkro-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Me"},"example":{"id":"n57a1b2c3","name":"Script de facturation","organization":{"id":"o57m3n4p5","slug":"nova","name":"Nova Studio"},"scopes":["read","write"],"channels":[{"id":"j57z9q4t1","name":"client-acme"}],"owner":{"name":"Léa Martin"}}}}},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/Internal"}}}},"/channels":{"get":{"operationId":"getChannels","summary":"Lister les canaux ouverts","description":"Les canaux ouverts à la clé, dans l'ordre de la barre latérale.","parameters":[{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"Une page de canaux.","headers":{"Synkro-Request-Id":{"$ref":"#/components/headers/Synkro-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","description":"Une page de canaux.","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Channel"}},"next_cursor":{"oneOf":[{"type":"string","description":"Curseur de la page suivante, `null` à la dernière page."},{"type":"null"}]}},"required":["data","next_cursor"]},"example":{"data":[{"id":"j57z9q4t1","name":"client-acme","visibility":"public","project_key":"ACME","archived":false}],"next_cursor":null}}}},"400":{"$ref":"#/components/responses/Validation"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/Internal"}}}},"/channels/{channel_id}":{"get":{"operationId":"getChannelsChannelId","summary":"Lire un canal","description":"Un canal ouvert à la clé.","parameters":[{"$ref":"#/components/parameters/ChannelId"}],"responses":{"200":{"description":"Le canal.","headers":{"Synkro-Request-Id":{"$ref":"#/components/headers/Synkro-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Channel"},"example":{"id":"j57z9q4t1","name":"client-acme","visibility":"public","project_key":"ACME","archived":false}}}},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"description":"`not_found` : ressource inconnue ou hors de portée de la clé (canal non ouvert, canal confidentiel, message privé) ; les deux cas sont indiscernables.","headers":{"Synkro-Request-Id":{"$ref":"#/components/headers/Synkro-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"not_found","message":"Canal introuvable.","request_id":"req_8f3a1c0d2b7e4a69"}}}}},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/Internal"}}}},"/channels/{channel_id}/members":{"get":{"operationId":"getChannelsChannelIdMembers","summary":"Lister les personnes d'un canal","description":"Les personnes visibles dans le canal, avec le jeton `mention` qui les notifie. Une seule page : `next_cursor` est toujours `null`.","parameters":[{"$ref":"#/components/parameters/ChannelId"}],"responses":{"200":{"description":"Les personnes du canal.","headers":{"Synkro-Request-Id":{"$ref":"#/components/headers/Synkro-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","description":"Les personnes du canal.","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ChannelMember"}},"next_cursor":{"oneOf":[{"type":"string","description":"Curseur de la page suivante, `null` à la dernière page."},{"type":"null"}]}},"required":["data","next_cursor"]},"example":{"data":[{"id":"k5712f3x9","name":"Léa Martin","external":false,"mention":"<@k5712f3x9>"}],"next_cursor":null}}}},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/Internal"}}}},"/members":{"get":{"operationId":"getMembers","summary":"Lister les membres internes","description":"Les membres internes actifs de l'organisation, avec leur e-mail, pour faire correspondre un compte d'un autre outil à une personne de Synkro. Jamais une personne externe. Une seule page : `next_cursor` est toujours `null`.","responses":{"200":{"description":"Les membres internes.","headers":{"Synkro-Request-Id":{"$ref":"#/components/headers/Synkro-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","description":"Les membres internes.","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Member"}},"next_cursor":{"oneOf":[{"type":"string","description":"Curseur de la page suivante, `null` à la dernière page."},{"type":"null"}]}},"required":["data","next_cursor"]},"example":{"data":[{"id":"k5712f3x9","name":"Léa Martin","email":"lea@nova.example","role":"member"}],"next_cursor":null}}}},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/Internal"}}}},"/channels/{channel_id}/messages":{"get":{"operationId":"getChannelsChannelIdMessages","summary":"Lister les messages d'un canal","description":"Les messages, du plus récent au plus ancien. `around` ancre la page sur un message.","parameters":[{"$ref":"#/components/parameters/ChannelId"},{"name":"around","in":"query","description":"Identifiant d'un message autour duquel lire.","schema":{"type":"string"}},{"$ref":"#/components/parameters/MessagesLimit"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"Une page de messages.","headers":{"Synkro-Request-Id":{"$ref":"#/components/headers/Synkro-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","description":"Une page de messages.","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Message"}},"next_cursor":{"oneOf":[{"type":"string","description":"Curseur de la page suivante, `null` à la dernière page."},{"type":"null"}]}},"required":["data","next_cursor"]},"example":{"data":[{"id":"k17c0m8s2","channel_id":"j57z9q4t1","text":"Facture envoyée.","author":{"type":"app","id":"n57a1b2c3","name":"Script de facturation"},"reply_to_id":null,"attachments":[{"id":"f57d0c1e5","name":"devis.pdf","mime_type":"application/pdf","size":48213}],"created_at":"2026-10-09T14:03:00.000Z","edited_at":null,"url":"https://app.mysynkro.fr/nova/c/j57z9q4t1?message=k17c0m8s2"}],"next_cursor":null}}}},"400":{"$ref":"#/components/responses/Validation"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/Internal"}}},"post":{"operationId":"postChannelsChannelIdMessages","summary":"Publier un message","description":"Publie un message au nom de l'intégration dans un canal ouvert à la clé. Portée `write`.","parameters":[{"$ref":"#/components/parameters/ChannelId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMessageRequest"},"example":{"text":"Facture envoyée.","reply_to_id":null}}}},"responses":{"201":{"description":"Le message créé.","headers":{"Synkro-Request-Id":{"$ref":"#/components/headers/Synkro-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Message"},"example":{"id":"k17c0m8s2","channel_id":"j57z9q4t1","text":"Facture envoyée.","author":{"type":"app","id":"n57a1b2c3","name":"Script de facturation"},"reply_to_id":null,"attachments":[{"id":"f57d0c1e5","name":"devis.pdf","mime_type":"application/pdf","size":48213}],"created_at":"2026-10-09T14:03:00.000Z","edited_at":null,"url":"https://app.mysynkro.fr/nova/c/j57z9q4t1?message=k17c0m8s2"}}}},"400":{"description":"`validation` : JSON invalide, champ manquant, en trop ou mal typé, paramètre hors limites, curseur invalide, ou valeur refusée par une règle (texte trop long, adresse non joignable). Une requête mal formée ne consomme pas le quota.","headers":{"Synkro-Request-Id":{"$ref":"#/components/headers/Synkro-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation","message":"Le champ « text » est obligatoire.","request_id":"req_8f3a1c0d2b7e4a69"}}}}},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"description":"`not_found` : ressource inconnue ou hors de portée de la clé (canal non ouvert, canal confidentiel, message privé) ; les deux cas sont indiscernables.","headers":{"Synkro-Request-Id":{"$ref":"#/components/headers/Synkro-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"not_found","message":"Canal introuvable.","request_id":"req_8f3a1c0d2b7e4a69"}}}}},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/Internal"}}}},"/channels/{channel_id}/tickets":{"get":{"operationId":"getChannelsChannelIdTickets","summary":"Lister les tickets d'un projet","description":"Les tickets du projet du canal, au format complet. Les filtres se cumulent.","parameters":[{"$ref":"#/components/parameters/ChannelId"},{"name":"status","in":"query","description":"Statut du ticket.","schema":{"enum":["todo","in_progress","in_review","done"]}},{"name":"assignee_id","in":"query","description":"Personne assignée.","schema":{"type":"string"}},{"name":"sprint_id","in":"query","description":"Sprint.","schema":{"type":"string"}},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"Une page de tickets.","headers":{"Synkro-Request-Id":{"$ref":"#/components/headers/Synkro-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","description":"Une page de tickets.","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Ticket"}},"next_cursor":{"oneOf":[{"type":"string","description":"Curseur de la page suivante, `null` à la dernière page."},{"type":"null"}]}},"required":["data","next_cursor"]},"example":{"data":[{"id":"t57e8w2r4","key":"ACME-42","channel_id":"j57z9q4t1","title":"Corriger la facture 2026-118","type":"task","status":"todo","priority":"medium","assignee":{"id":"k5712f3x9","name":"Léa Martin"},"reporter":{"type":"app","id":"n57a1b2c3","name":"Script de facturation"},"sprint_id":null,"due_date":"2026-10-20","labels":["facturation"],"description":"Le montant HT est faux.","created_at":"2026-10-09T14:03:00.000Z","updated_at":"2026-10-09T14:03:00.000Z","url":"https://app.mysynkro.fr/nova/t/ACME-42"}],"next_cursor":null}}}},"400":{"$ref":"#/components/responses/Validation"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/Internal"}}},"post":{"operationId":"postChannelsChannelIdTickets","summary":"Créer un ticket","description":"Crée un ticket dans le projet du canal, au nom de l'intégration. Portée `write`.","parameters":[{"$ref":"#/components/parameters/ChannelId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTicketRequest"},"example":{"title":"Corriger la facture 2026-118","type":"task","priority":"medium","assignee_id":"k5712f3x9","description":"Le montant HT est faux.","due_date":"2026-10-20","labels":["facturation"]}}}},"responses":{"201":{"description":"Le ticket créé.","headers":{"Synkro-Request-Id":{"$ref":"#/components/headers/Synkro-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ticket"},"example":{"id":"t57e8w2r4","key":"ACME-42","channel_id":"j57z9q4t1","title":"Corriger la facture 2026-118","type":"task","status":"todo","priority":"medium","assignee":{"id":"k5712f3x9","name":"Léa Martin"},"reporter":{"type":"app","id":"n57a1b2c3","name":"Script de facturation"},"sprint_id":null,"due_date":"2026-10-20","labels":["facturation"],"description":"Le montant HT est faux.","created_at":"2026-10-09T14:03:00.000Z","updated_at":"2026-10-09T14:03:00.000Z","url":"https://app.mysynkro.fr/nova/t/ACME-42"}}}},"400":{"$ref":"#/components/responses/Validation"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"description":"`not_found` : ressource inconnue ou hors de portée de la clé (canal non ouvert, canal confidentiel, message privé) ; les deux cas sont indiscernables.","headers":{"Synkro-Request-Id":{"$ref":"#/components/headers/Synkro-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"not_found","message":"Canal introuvable.","request_id":"req_8f3a1c0d2b7e4a69"}}}}},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/Internal"}}}},"/tickets/{key}":{"get":{"operationId":"getTicketsKey","summary":"Lire un ticket","description":"Le détail d'un ticket, par sa clé.","parameters":[{"$ref":"#/components/parameters/TicketKey"}],"responses":{"200":{"description":"Le ticket.","headers":{"Synkro-Request-Id":{"$ref":"#/components/headers/Synkro-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ticket"},"example":{"id":"t57e8w2r4","key":"ACME-42","channel_id":"j57z9q4t1","title":"Corriger la facture 2026-118","type":"task","status":"todo","priority":"medium","assignee":{"id":"k5712f3x9","name":"Léa Martin"},"reporter":{"type":"app","id":"n57a1b2c3","name":"Script de facturation"},"sprint_id":null,"due_date":"2026-10-20","labels":["facturation"],"description":"Le montant HT est faux.","created_at":"2026-10-09T14:03:00.000Z","updated_at":"2026-10-09T14:03:00.000Z","url":"https://app.mysynkro.fr/nova/t/ACME-42"}}}},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"description":"`not_found` : ressource inconnue ou hors de portée de la clé (canal non ouvert, canal confidentiel, message privé) ; les deux cas sont indiscernables.","headers":{"Synkro-Request-Id":{"$ref":"#/components/headers/Synkro-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"not_found","message":"Ticket introuvable.","request_id":"req_8f3a1c0d2b7e4a69"}}}}},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/Internal"}}},"patch":{"operationId":"patchTicketsKey","summary":"Modifier un ticket","description":"Modifie au moins un champ du ticket. Les champs sont appliqués dans l'ordre du corps ; si l'un est refusé après d'autres, la réponse d'erreur porte en plus `applied`, la liste des champs déjà appliqués. Portée `write`.","parameters":[{"$ref":"#/components/parameters/TicketKey"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTicketRequest"},"example":{"status":"in_progress","assignee_id":"k5712f3x9"}}}},"responses":{"200":{"description":"Le ticket modifié et les champs appliqués.","headers":{"Synkro-Request-Id":{"$ref":"#/components/headers/Synkro-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"}},"content":{"application/json":{"schema":{"type":"object","properties":{"ticket":{"$ref":"#/components/schemas/Ticket"},"applied":{"type":"array","items":{"type":"string"},"description":"Les champs appliqués, dans l'ordre."}},"required":["ticket","applied"]},"example":{"ticket":{"id":"t57e8w2r4","key":"ACME-42","channel_id":"j57z9q4t1","title":"Corriger la facture 2026-118","type":"task","status":"todo","priority":"medium","assignee":{"id":"k5712f3x9","name":"Léa Martin"},"reporter":{"type":"app","id":"n57a1b2c3","name":"Script de facturation"},"sprint_id":null,"due_date":"2026-10-20","labels":["facturation"],"description":"Le montant HT est faux.","created_at":"2026-10-09T14:03:00.000Z","updated_at":"2026-10-09T14:03:00.000Z","url":"https://app.mysynkro.fr/nova/t/ACME-42"},"applied":["status","assignee_id"]}}}},"400":{"description":"`validation` : JSON invalide, champ manquant, en trop ou mal typé, paramètre hors limites, curseur invalide, ou valeur refusée par une règle (texte trop long, adresse non joignable). Une requête mal formée ne consomme pas le quota.","headers":{"Synkro-Request-Id":{"$ref":"#/components/headers/Synkro-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation","message":"Indique au moins un champ à modifier.","request_id":"req_8f3a1c0d2b7e4a69"}}}}},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/Internal"}}}},"/tickets/{key}/comments":{"get":{"operationId":"getTicketsKeyComments","summary":"Lister les commentaires d'un ticket","description":"Les commentaires, du plus ancien au plus récent. La lecture est bornée à 1 000 commentaires : au-delà, les plus anciens manquent (seuls les plus récents sont listés) et `next_cursor` vaut `null` à la fin de la liste tronquée.","parameters":[{"$ref":"#/components/parameters/TicketKey"},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"Une page de commentaires.","headers":{"Synkro-Request-Id":{"$ref":"#/components/headers/Synkro-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","description":"Une page de commentaires.","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Comment"}},"next_cursor":{"oneOf":[{"type":"string","description":"Curseur de la page suivante, `null` à la dernière page."},{"type":"null"}]}},"required":["data","next_cursor"]},"example":{"data":[{"id":"c57h4v7b1","ticket_key":"ACME-42","text":"Corrigé dans la version 2.","author":{"type":"person","id":"k5712f3x9","name":"Léa Martin","external":false},"created_at":"2026-10-09T14:03:00.000Z","edited_at":null}],"next_cursor":null}}}},"400":{"$ref":"#/components/responses/Validation"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/Internal"}}},"post":{"operationId":"postTicketsKeyComments","summary":"Commenter un ticket","description":"Ajoute un commentaire au nom de l'intégration. Portée `write`.","parameters":[{"$ref":"#/components/parameters/TicketKey"},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCommentRequest"},"example":{"text":"Corrigé dans la version 2."}}}},"responses":{"201":{"description":"Le commentaire créé.","headers":{"Synkro-Request-Id":{"$ref":"#/components/headers/Synkro-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"},"example":{"id":"c57h4v7b1","ticket_key":"ACME-42","text":"Corrigé dans la version 2.","author":{"type":"person","id":"k5712f3x9","name":"Léa Martin","external":false},"created_at":"2026-10-09T14:03:00.000Z","edited_at":null}}}},"400":{"$ref":"#/components/responses/Validation"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/Internal"}}}},"/webhooks":{"get":{"operationId":"getWebhooks","summary":"Lister les abonnements","description":"Les abonnements REST Hooks de cette intégration (10 au plus), du plus récent au plus ancien, sans secret. Une seule page : `next_cursor` est toujours `null`.","responses":{"200":{"description":"Les abonnements.","headers":{"Synkro-Request-Id":{"$ref":"#/components/headers/Synkro-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","description":"Les abonnements.","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Webhook"}},"next_cursor":{"oneOf":[{"type":"string","description":"Curseur de la page suivante, `null` à la dernière page."},{"type":"null"}]}},"required":["data","next_cursor"]},"example":{"data":[{"id":"w57q2e9d6","url":"https://hooks.zapier.com/hooks/catch/123/abc","events":["ticket.created"],"channel_ids":["j57z9q4t1"],"status":"active","created_at":"2026-10-09T14:03:00.000Z"}],"next_cursor":null}}}},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/Internal"}}},"post":{"operationId":"postWebhooks","summary":"Créer un abonnement","description":"Crée un abonnement REST Hooks : une destination sortante de l'intégration, avec les mêmes événements, la même signature et les mêmes relances que les webhooks sortants de l'app. Les canaux demandés doivent être ouverts à la clé et lisibles par son titulaire ; sinon `404`. 10 abonnements au plus par intégration (`422 limit_reached`). Portée `write`. Avec `Idempotency-Key`, un rejeu renvoie le même abonnement **sans `secret`**, avec `Idempotent-Replayed: true` : garde le secret de la première réponse, Synkro ne le conserve pas pour le rejeu.","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhookRequest"},"example":{"url":"https://hooks.zapier.com/hooks/catch/123/abc","events":["ticket.created"],"channel_ids":["j57z9q4t1"]}}}},"responses":{"201":{"description":"L'abonnement créé, avec son secret (rendu cette seule fois ; absent d'un rejeu).","headers":{"Synkro-Request-Id":{"$ref":"#/components/headers/Synkro-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCreated"},"example":{"id":"w57q2e9d6","url":"https://hooks.zapier.com/hooks/catch/123/abc","events":["ticket.created"],"channel_ids":["j57z9q4t1"],"secret":"whsec_k3Jx9Qm2Vt7LwRn4Zp8Ys1Ud5Hc6Bf0A","created_at":"2026-10-09T14:03:00.000Z"}}}},"400":{"description":"`validation` : JSON invalide, champ manquant, en trop ou mal typé, paramètre hors limites, curseur invalide, ou valeur refusée par une règle (texte trop long, adresse non joignable). Une requête mal formée ne consomme pas le quota.","headers":{"Synkro-Request-Id":{"$ref":"#/components/headers/Synkro-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"},"example":{"error":{"code":"validation","message":"Cette adresse n'est pas joignable depuis Synkro.","request_id":"req_8f3a1c0d2b7e4a69"}}}}},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/Internal"}}}},"/webhooks/{id}":{"get":{"operationId":"getWebhooksId","summary":"Lire un abonnement","description":"Un abonnement de cette intégration, sans secret. Un abonnement d'une autre intégration répond `404`.","parameters":[{"$ref":"#/components/parameters/WebhookId"}],"responses":{"200":{"description":"L'abonnement.","headers":{"Synkro-Request-Id":{"$ref":"#/components/headers/Synkro-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Webhook"},"example":{"id":"w57q2e9d6","url":"https://hooks.zapier.com/hooks/catch/123/abc","events":["ticket.created"],"channel_ids":["j57z9q4t1"],"status":"active","created_at":"2026-10-09T14:03:00.000Z"}}}},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/Internal"}}},"delete":{"operationId":"deleteWebhooksId","summary":"Supprimer un abonnement","description":"Supprime un abonnement de cette intégration. Portée `write`.","parameters":[{"$ref":"#/components/parameters/WebhookId"}],"responses":{"204":{"description":"L'abonnement est supprimé.","headers":{"Synkro-Request-Id":{"$ref":"#/components/headers/Synkro-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}}},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/Internal"}}}},"/webhooks/{id}/test":{"post":{"operationId":"postWebhooksIdTest","summary":"Tester un abonnement","description":"Envoie un événement `ping` signé à cet abonnement seul. Portée `write`. Rejouée avec la même `Idempotency-Key`, la route renvoie le premier résultat sans envoyer un second `ping`.","parameters":[{"$ref":"#/components/parameters/WebhookId"},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"description":"Le résultat de l'envoi.","headers":{"Synkro-Request-Id":{"$ref":"#/components/headers/Synkro-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookTestResult"},"example":{"ok":true,"status_code":200,"error":null,"duration_ms":182}}}},"400":{"$ref":"#/components/responses/Validation"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"422":{"$ref":"#/components/responses/Unprocessable"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/Internal"}}}},"/openapi.json":{"get":{"operationId":"getOpenapiJson","summary":"Ce document","description":"Le document OpenAPI de l'API, sans authentification.","security":[],"responses":{"200":{"description":"Le document OpenAPI 3.1.","headers":{"Synkro-Request-Id":{"$ref":"#/components/headers/Synkro-Request-Id"}},"content":{"application/json":{"schema":{"type":"object","description":"Document OpenAPI 3.1."}}}},"403":{"$ref":"#/components/responses/ForbiddenOrigin"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"500":{"$ref":"#/components/responses/Internal"}}}}},"webhooks":{"message.posted":{"post":{"operationId":"event.message.posted","summary":"message.posted","description":"Un message est publié dans un canal (personne, intégration ou système). Synkro envoie ce corps à l'adresse de l'abonnement, signé (en-têtes `webhook-id`, `webhook-timestamp`, `webhook-signature`) ; l'en-tête `Synkro-Event` porte le type. Réponds par un code 2xx.","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventEnvelope"},"example":{"id":"evt_k57c3d4e5","type":"message.posted","version":1,"created_at":"2026-10-09T14:03:00.000Z","organization":{"id":"o57m3n4p5","slug":"nova","name":"Nova Studio"},"data":{"message":{"id":"k17c0m8s2","channel_id":"j57z9q4t1","text":"Facture envoyée.","author":{"type":"app","id":"n57a1b2c3","name":"Script de facturation"},"reply_to_id":null,"attachments":[{"id":"f57d0c1e5","name":"devis.pdf","mime_type":"application/pdf","size":48213}],"created_at":"2026-10-09T14:03:00.000Z","edited_at":null,"url":"https://app.mysynkro.fr/nova/c/j57z9q4t1?message=k17c0m8s2"},"channel":{"id":"j57z9q4t1","name":"client-acme"},"actor":{"type":"person","id":"k5712f3x9","name":"Léa Martin","external":false}}}}}},"responses":{"200":{"description":"Événement reçu."}}}},"ticket.created":{"post":{"operationId":"event.ticket.created","summary":"ticket.created","description":"Un ticket est créé, y compris depuis un message. Synkro envoie ce corps à l'adresse de l'abonnement, signé (en-têtes `webhook-id`, `webhook-timestamp`, `webhook-signature`) ; l'en-tête `Synkro-Event` porte le type. Réponds par un code 2xx.","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventEnvelope"},"example":{"id":"evt_k57c3d4e5","type":"ticket.created","version":1,"created_at":"2026-10-09T14:03:00.000Z","organization":{"id":"o57m3n4p5","slug":"nova","name":"Nova Studio"},"data":{"ticket":{"id":"t57e8w2r4","key":"ACME-42","channel_id":"j57z9q4t1","title":"Corriger la facture 2026-118","type":"task","status":"todo","priority":"medium","assignee":{"id":"k5712f3x9","name":"Léa Martin"},"reporter":{"type":"app","id":"n57a1b2c3","name":"Script de facturation"},"sprint_id":null,"due_date":"2026-10-20","labels":["facturation"],"description":"Le montant HT est faux.","created_at":"2026-10-09T14:03:00.000Z","updated_at":"2026-10-09T14:03:00.000Z","url":"https://app.mysynkro.fr/nova/t/ACME-42"},"channel":{"id":"j57z9q4t1","name":"client-acme"},"actor":{"type":"person","id":"k5712f3x9","name":"Léa Martin","external":false}}}}}},"responses":{"200":{"description":"Événement reçu."}}}},"ticket.updated":{"post":{"operationId":"event.ticket.updated","summary":"ticket.updated","description":"Un champ d'un ticket change, hors statut et assignation. Les champs changés par une même opération sont groupés. Synkro envoie ce corps à l'adresse de l'abonnement, signé (en-têtes `webhook-id`, `webhook-timestamp`, `webhook-signature`) ; l'en-tête `Synkro-Event` porte le type. Réponds par un code 2xx.","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventEnvelope"},"example":{"id":"evt_k57c3d4e5","type":"ticket.updated","version":1,"created_at":"2026-10-09T14:03:00.000Z","organization":{"id":"o57m3n4p5","slug":"nova","name":"Nova Studio"},"data":{"ticket":{"id":"t57e8w2r4","key":"ACME-42","channel_id":"j57z9q4t1","title":"Corriger la facture 2026-118","type":"task","status":"todo","priority":"medium","assignee":{"id":"k5712f3x9","name":"Léa Martin"},"reporter":{"type":"app","id":"n57a1b2c3","name":"Script de facturation"},"sprint_id":null,"due_date":"2026-10-20","labels":["facturation"],"description":"Le montant HT est faux.","created_at":"2026-10-09T14:03:00.000Z","updated_at":"2026-10-09T14:03:00.000Z","url":"https://app.mysynkro.fr/nova/t/ACME-42"},"channel":{"id":"j57z9q4t1","name":"client-acme"},"changes":[{"field":"priority","from":"low","to":"medium"}],"actor":{"type":"person","id":"k5712f3x9","name":"Léa Martin","external":false}}}}}},"responses":{"200":{"description":"Événement reçu."}}}},"ticket.status_changed":{"post":{"operationId":"event.ticket.status_changed","summary":"ticket.status_changed","description":"Le statut d'un ticket change. Synkro envoie ce corps à l'adresse de l'abonnement, signé (en-têtes `webhook-id`, `webhook-timestamp`, `webhook-signature`) ; l'en-tête `Synkro-Event` porte le type. Réponds par un code 2xx.","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventEnvelope"},"example":{"id":"evt_k57c3d4e5","type":"ticket.status_changed","version":1,"created_at":"2026-10-09T14:03:00.000Z","organization":{"id":"o57m3n4p5","slug":"nova","name":"Nova Studio"},"data":{"ticket":{"id":"t57e8w2r4","key":"ACME-42","channel_id":"j57z9q4t1","title":"Corriger la facture 2026-118","type":"task","status":"todo","priority":"medium","assignee":{"id":"k5712f3x9","name":"Léa Martin"},"reporter":{"type":"app","id":"n57a1b2c3","name":"Script de facturation"},"sprint_id":null,"due_date":"2026-10-20","labels":["facturation"],"description":"Le montant HT est faux.","created_at":"2026-10-09T14:03:00.000Z","updated_at":"2026-10-09T14:03:00.000Z","url":"https://app.mysynkro.fr/nova/t/ACME-42"},"channel":{"id":"j57z9q4t1","name":"client-acme"},"from":"todo","to":"in_progress","actor":{"type":"person","id":"k5712f3x9","name":"Léa Martin","external":false}}}}}},"responses":{"200":{"description":"Événement reçu."}}}},"ticket.assigned":{"post":{"operationId":"event.ticket.assigned","summary":"ticket.assigned","description":"L'assigné d'un ticket change, y compris retiré (`to` vaut alors `null`). Synkro envoie ce corps à l'adresse de l'abonnement, signé (en-têtes `webhook-id`, `webhook-timestamp`, `webhook-signature`) ; l'en-tête `Synkro-Event` porte le type. Réponds par un code 2xx.","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventEnvelope"},"example":{"id":"evt_k57c3d4e5","type":"ticket.assigned","version":1,"created_at":"2026-10-09T14:03:00.000Z","organization":{"id":"o57m3n4p5","slug":"nova","name":"Nova Studio"},"data":{"ticket":{"id":"t57e8w2r4","key":"ACME-42","channel_id":"j57z9q4t1","title":"Corriger la facture 2026-118","type":"task","status":"todo","priority":"medium","assignee":{"id":"k5712f3x9","name":"Léa Martin"},"reporter":{"type":"app","id":"n57a1b2c3","name":"Script de facturation"},"sprint_id":null,"due_date":"2026-10-20","labels":["facturation"],"description":"Le montant HT est faux.","created_at":"2026-10-09T14:03:00.000Z","updated_at":"2026-10-09T14:03:00.000Z","url":"https://app.mysynkro.fr/nova/t/ACME-42"},"channel":{"id":"j57z9q4t1","name":"client-acme"},"from":null,"to":{"id":"k5712f3x9","name":"Léa Martin"},"actor":{"type":"person","id":"k5712f3x9","name":"Léa Martin","external":false}}}}}},"responses":{"200":{"description":"Événement reçu."}}}},"ticket.commented":{"post":{"operationId":"event.ticket.commented","summary":"ticket.commented","description":"Un commentaire est ajouté à un ticket. Synkro envoie ce corps à l'adresse de l'abonnement, signé (en-têtes `webhook-id`, `webhook-timestamp`, `webhook-signature`) ; l'en-tête `Synkro-Event` porte le type. Réponds par un code 2xx.","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventEnvelope"},"example":{"id":"evt_k57c3d4e5","type":"ticket.commented","version":1,"created_at":"2026-10-09T14:03:00.000Z","organization":{"id":"o57m3n4p5","slug":"nova","name":"Nova Studio"},"data":{"ticket":{"key":"ACME-42","title":"Corriger la facture 2026-118","url":"https://app.mysynkro.fr/nova/t/ACME-42"},"channel":{"id":"j57z9q4t1","name":"client-acme"},"comment":{"id":"c57h4v7b1","ticket_key":"ACME-42","text":"Corrigé dans la version 2.","author":{"type":"person","id":"k5712f3x9","name":"Léa Martin","external":false},"created_at":"2026-10-09T14:03:00.000Z","edited_at":null},"actor":{"type":"person","id":"k5712f3x9","name":"Léa Martin","external":false}}}}}},"responses":{"200":{"description":"Événement reçu."}}}},"member.joined":{"post":{"operationId":"event.member.joined","summary":"member.joined","description":"Un interne rejoint l'organisation, ou un externe rejoint un canal (`channel` est alors présent). Jamais d'adresse e-mail. Synkro envoie ce corps à l'adresse de l'abonnement, signé (en-têtes `webhook-id`, `webhook-timestamp`, `webhook-signature`) ; l'en-tête `Synkro-Event` porte le type. Réponds par un code 2xx.","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventEnvelope"},"example":{"id":"evt_k57c3d4e5","type":"member.joined","version":1,"created_at":"2026-10-09T14:03:00.000Z","organization":{"id":"o57m3n4p5","slug":"nova","name":"Nova Studio"},"data":{"member":{"id":"k5712f3x9","name":"Léa Martin","role":"member","external":false},"actor":{"type":"person","id":"k5712f3x9","name":"Léa Martin","external":false}}}}}},"responses":{"200":{"description":"Événement reçu."}}}},"call.started":{"post":{"operationId":"event.call.started","summary":"call.started","description":"Un appel de canal démarre (jamais un appel privé). Synkro envoie ce corps à l'adresse de l'abonnement, signé (en-têtes `webhook-id`, `webhook-timestamp`, `webhook-signature`) ; l'en-tête `Synkro-Event` porte le type. Réponds par un code 2xx.","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventEnvelope"},"example":{"id":"evt_k57c3d4e5","type":"call.started","version":1,"created_at":"2026-10-09T14:03:00.000Z","organization":{"id":"o57m3n4p5","slug":"nova","name":"Nova Studio"},"data":{"call":{"id":"a57r1s2t3","started_at":"2026-10-09T14:03:00.000Z","ended_at":null,"participant_count":1},"channel":{"id":"j57z9q4t1","name":"client-acme"},"actor":{"type":"person","id":"k5712f3x9","name":"Léa Martin","external":false}}}}}},"responses":{"200":{"description":"Événement reçu."}}}},"call.ended":{"post":{"operationId":"event.call.ended","summary":"call.ended","description":"Un appel de canal se termine. Synkro envoie ce corps à l'adresse de l'abonnement, signé (en-têtes `webhook-id`, `webhook-timestamp`, `webhook-signature`) ; l'en-tête `Synkro-Event` porte le type. Réponds par un code 2xx.","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventEnvelope"},"example":{"id":"evt_k57c3d4e5","type":"call.ended","version":1,"created_at":"2026-10-09T14:03:00.000Z","organization":{"id":"o57m3n4p5","slug":"nova","name":"Nova Studio"},"data":{"call":{"id":"a57r1s2t3","started_at":"2026-10-09T14:03:00.000Z","ended_at":"2026-10-09T14:03:00.000Z","participant_count":3},"channel":{"id":"j57z9q4t1","name":"client-acme"},"actor":{"type":"person","id":"k5712f3x9","name":"Léa Martin","external":false}}}}}},"responses":{"200":{"description":"Événement reçu."}}}},"file.uploaded":{"post":{"operationId":"event.file.uploaded","summary":"file.uploaded","description":"Une pièce jointe est prête dans un message de canal ou un ticket. Aucune adresse de téléchargement. Synkro envoie ce corps à l'adresse de l'abonnement, signé (en-têtes `webhook-id`, `webhook-timestamp`, `webhook-signature`) ; l'en-tête `Synkro-Event` porte le type. Réponds par un code 2xx.","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventEnvelope"},"example":{"id":"evt_k57c3d4e5","type":"file.uploaded","version":1,"created_at":"2026-10-09T14:03:00.000Z","organization":{"id":"o57m3n4p5","slug":"nova","name":"Nova Studio"},"data":{"file":{"id":"f57d0c1e5","name":"devis.pdf","mime_type":"application/pdf","size":48213},"channel":{"id":"j57z9q4t1","name":"client-acme"},"message_id":"k17c0m8s2","url":"https://app.mysynkro.fr/nova/c/j57z9q4t1?message=k17c0m8s2","actor":{"type":"person","id":"k5712f3x9","name":"Léa Martin","external":false}}}}}},"responses":{"200":{"description":"Événement reçu."}}}},"ping":{"post":{"operationId":"event.ping","summary":"ping","description":"Envoi de test, depuis l'écran des intégrations ou par `POST /webhooks/{id}/test`. Synkro envoie ce corps à l'adresse de l'abonnement, signé (en-têtes `webhook-id`, `webhook-timestamp`, `webhook-signature`) ; l'en-tête `Synkro-Event` porte le type. Réponds par un code 2xx.","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventEnvelope"},"example":{"id":"evt_k57c3d4e5","type":"ping","version":1,"created_at":"2026-10-09T14:03:00.000Z","organization":{"id":"o57m3n4p5","slug":"nova","name":"Nova Studio"},"data":{}}}}},"responses":{"200":{"description":"Événement reçu."}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Clé d'API de l'intégration (`syk_key_…`)."},"oauth2":{"type":"oauth2","description":"Connexion OAuth 2.1 d'un connecteur (Make) : la personne qui autorise est propriétaire ou administratrice, choisit l'organisation, les accès et les canaux ; le jeton (`syk_oat_…`) est celui de l'intégration créée.","flows":{"authorizationCode":{"authorizationUrl":"https://mcp.mysynkro.fr/oauth/authorize","tokenUrl":"https://mcp.mysynkro.fr/oauth/token","scopes":{"synkro:read":"Lire les canaux ouverts à l'intégration.","synkro:write":"Écrire dans les canaux ouverts à l'intégration."}}}}},"schemas":{"Error":{"type":"object","description":"Corps de toute réponse d'erreur.","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["validation","unauthenticated","forbidden","plan_required","org_read_only","org_suspended","not_found","method_not_allowed","conflict","payload_too_large","limit_reached","rate_limited","internal"],"description":"Code stable, à tester côté client."},"message":{"type":"string","description":"Message en français, destiné à une personne."},"request_id":{"type":"string","description":"Identifiant de la requête, repris dans l'en-tête `Synkro-Request-Id`.","pattern":"^req_"}},"required":["code","message","request_id"]},"applied":{"type":"array","items":{"type":"string"},"description":"Seulement dans la réponse d'erreur de `PATCH /tickets/{key}` quand des champs étaient déjà appliqués : leur liste, dans l'ordre."}},"required":["error"]},"Author":{"description":"Qui a écrit : une personne, une intégration ou le système.","oneOf":[{"type":"object","properties":{"type":{"const":"person"},"id":{"type":"string","description":"Identifiant de la personne."},"name":{"type":"string","description":"Nom affiché."},"external":{"type":"boolean","description":"`true` pour une personne externe."}},"required":["type","id","name","external"]},{"type":"object","properties":{"type":{"const":"app"},"id":{"type":"string","description":"Identifiant de l'intégration."},"name":{"type":"string","description":"Nom de l'intégration."}},"required":["type","id","name"]},{"type":"object","properties":{"type":{"const":"system"}},"required":["type"]}]},"ChannelRef":{"type":"object","properties":{"id":{"type":"string","description":"Identifiant du canal."},"name":{"type":"string","description":"Nom du canal."}},"required":["id","name"]},"Attachment":{"type":"object","description":"Pièce jointe listée : jamais téléchargeable par l'API v1.","properties":{"id":{"type":"string","description":"Identifiant de la pièce jointe."},"name":{"type":"string","description":"Nom du fichier."},"mime_type":{"type":"string","description":"Type MIME."},"size":{"type":"integer","description":"Taille en octets."}},"required":["id","name","mime_type","size"]},"Me":{"type":"object","description":"L'intégration à laquelle la clé appartient.","properties":{"id":{"type":"string","description":"Identifiant de l'intégration."},"name":{"type":"string","description":"Nom de l'intégration."},"organization":{"type":"object","properties":{"id":{"type":"string","description":"Identifiant."},"slug":{"type":"string","description":"Identifiant court."},"name":{"type":"string","description":"Nom."}},"required":["id","slug","name"]},"scopes":{"type":"array","items":{"enum":["read","write"]},"description":"Portées de la clé."},"channels":{"type":"array","items":{"$ref":"#/components/schemas/ChannelRef"},"description":"Canaux ouverts à la clé."},"owner":{"type":"object","properties":{"name":{"type":"string","description":"Nom du titulaire."}},"required":["name"]}},"required":["id","name","organization","scopes","channels","owner"]},"Channel":{"type":"object","properties":{"id":{"type":"string","description":"Identifiant du canal."},"name":{"type":"string","description":"Nom du canal."},"visibility":{"enum":["public","private"],"description":"Visibilité du canal."},"project_key":{"type":"string","description":"Clé du projet, préfixe des tickets (`ACME`)."},"archived":{"type":"boolean","description":"`true` si le canal est archivé."}},"required":["id","name","visibility","project_key","archived"]},"ChannelMember":{"type":"object","description":"Une personne visible dans le canal.","properties":{"id":{"type":"string","description":"Identifiant de la personne."},"name":{"type":"string","description":"Nom affiché."},"external":{"type":"boolean","description":"`true` pour une personne externe."},"mention":{"type":"string","description":"Jeton à écrire dans un message pour notifier la personne.","pattern":"^<@.+>$"}},"required":["id","name","external","mention"]},"Member":{"type":"object","description":"Un membre interne de l'organisation : jamais une personne externe.","properties":{"id":{"type":"string","description":"Identifiant de la personne."},"name":{"type":"string","description":"Nom affiché."},"email":{"type":"string","description":"Adresse e-mail (internes seulement)."},"role":{"type":"string","description":"Rôle dans l'organisation."}},"required":["id","name","email","role"]},"Message":{"type":"object","properties":{"id":{"type":"string","description":"Identifiant du message."},"channel_id":{"type":"string","description":"Identifiant du canal."},"text":{"type":"string","description":"Texte en Markdown."},"author":{"$ref":"#/components/schemas/Author"},"reply_to_id":{"oneOf":[{"type":"string","description":"Message auquel celui-ci répond."},{"type":"null"}]},"attachments":{"type":"array","items":{"$ref":"#/components/schemas/Attachment"}},"created_at":{"type":"string","format":"date-time","description":"Date de création."},"edited_at":{"oneOf":[{"type":"string","format":"date-time","description":"Date de la dernière modification."},{"type":"null"}]},"url":{"type":"string","description":"Lien qui ouvre le message dans l'app.","format":"uri"},"truncated":{"const":true,"description":"Présent dans un webhook dont le texte a été tronqué."}},"required":["id","channel_id","text","author","reply_to_id","attachments","created_at","edited_at","url"]},"Ticket":{"type":"object","properties":{"id":{"type":"string","description":"Identifiant du ticket."},"key":{"type":"string","description":"Clé du ticket (`ACME-42`)."},"channel_id":{"type":"string","description":"Identifiant du canal du projet."},"title":{"type":"string","description":"Titre."},"type":{"enum":["epic","story","task","bug","subtask"],"description":"Type de ticket."},"status":{"enum":["todo","in_progress","in_review","done"],"description":"Statut."},"priority":{"enum":["low","medium","high","critical"],"description":"Priorité."},"assignee":{"oneOf":[{"type":"object","properties":{"id":{"type":"string","description":"Identifiant."},"name":{"type":"string","description":"Nom."}},"required":["id","name"]},{"type":"null"}]},"reporter":{"$ref":"#/components/schemas/Author"},"sprint_id":{"oneOf":[{"type":"string","description":"Sprint du ticket."},{"type":"null"}]},"due_date":{"oneOf":[{"type":"string","description":"Échéance, `AAAA-MM-JJ`.","format":"date"},{"type":"null"}]},"labels":{"type":"array","items":{"type":"string"}},"description":{"oneOf":[{"type":"string","description":"Description en Markdown."},{"type":"null"}]},"created_at":{"type":"string","format":"date-time","description":"Date de création."},"updated_at":{"type":"string","format":"date-time","description":"Date de la dernière modification."},"url":{"type":"string","description":"Lien qui ouvre le ticket dans l'app.","format":"uri"},"truncated":{"const":true,"description":"Présent dans un webhook dont le texte a été tronqué."}},"required":["id","key","channel_id","title","type","status","priority","assignee","reporter","sprint_id","due_date","labels","description","created_at","updated_at","url"]},"Comment":{"type":"object","properties":{"id":{"type":"string","description":"Identifiant du commentaire."},"ticket_key":{"type":"string","description":"Clé du ticket."},"text":{"type":"string","description":"Texte en Markdown."},"author":{"$ref":"#/components/schemas/Author"},"created_at":{"type":"string","format":"date-time","description":"Date de création."},"edited_at":{"oneOf":[{"type":"string","format":"date-time","description":"Date de la dernière modification."},{"type":"null"}]},"truncated":{"const":true,"description":"Présent dans un webhook dont le texte a été tronqué."}},"required":["id","ticket_key","text","author","created_at","edited_at"]},"Webhook":{"type":"object","description":"Un abonnement REST Hooks, sans son secret.","properties":{"id":{"type":"string","description":"Identifiant de l'abonnement."},"url":{"type":"string","description":"Adresse qui reçoit les événements.","format":"uri"},"events":{"type":"array","items":{"$ref":"#/components/schemas/EventType"}},"channel_ids":{"oneOf":[{"type":"array","items":{"type":"string"},"description":"Canaux suivis ; `null` pour tous les canaux ouverts, relus à chaque événement."},{"type":"null"}]},"status":{"enum":["active","disabled","suspended"],"description":"État de l'abonnement : `active` (reçoit les événements), `disabled` (désactivé, par exemple après des échecs répétés) ou `suspended` (suspendu)."},"created_at":{"type":"string","format":"date-time","description":"Date de création."}},"required":["id","url","events","channel_ids","status","created_at"]},"WebhookCreated":{"type":"object","properties":{"id":{"type":"string","description":"Identifiant de l'abonnement."},"url":{"type":"string","description":"Adresse qui reçoit les événements.","format":"uri"},"events":{"type":"array","items":{"$ref":"#/components/schemas/EventType"}},"channel_ids":{"oneOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}]},"secret":{"type":"string","description":"Secret de signature (`whsec_…`), rendu **une seule fois**, à la première réponse ; absent d'un rejeu par `Idempotency-Key`."},"created_at":{"type":"string","format":"date-time","description":"Date de création."}},"required":["id","url","events","channel_ids","created_at"]},"WebhookTestResult":{"type":"object","properties":{"ok":{"type":"boolean","description":"`true` si l'adresse a répondu par un succès."},"status_code":{"oneOf":[{"type":"integer","description":"Code HTTP de la réponse."},{"type":"null"}]},"error":{"oneOf":[{"type":"string","description":"Cause de l'échec, en français."},{"type":"null"}]},"duration_ms":{"type":"integer","description":"Durée de l'envoi en millisecondes."}},"required":["ok","status_code","error","duration_ms"]},"EventType":{"enum":["message.posted","ticket.created","ticket.updated","ticket.status_changed","ticket.assigned","ticket.commented","member.joined","call.started","call.ended","file.uploaded","ping"],"description":"Type d'événement (liste fermée, §9.2)."},"EventEnvelope":{"type":"object","description":"Corps envoyé à l'adresse d'un abonnement ; la signature est dans les en-têtes `webhook-id`, `webhook-timestamp` et `webhook-signature`.","properties":{"id":{"type":"string","description":"Identifiant de l'événement, identique d'une tentative et d'un rejeu à l'autre : clé de déduplication.","pattern":"^evt_"},"type":{"$ref":"#/components/schemas/EventType"},"version":{"const":1,"description":"Version de la charge. Les ajouts de champs ne la changent pas."},"created_at":{"type":"string","format":"date-time","description":"Date de l'événement."},"organization":{"type":"object","properties":{"id":{"type":"string","description":"Identifiant."},"slug":{"type":"string","description":"Identifiant court."},"name":{"type":"string","description":"Nom."}},"required":["id","slug","name"]},"data":{"type":"object","description":"Instantané pris à l'émission ; contient `actor` (voir `Author`) quand il est connu."}},"required":["id","type","version","created_at","organization","data"]},"CreateMessageRequest":{"type":"object","properties":{"text":{"type":"string","description":"Texte en Markdown, 4 000 caractères au plus ; mentions `<@id>` des personnes visibles dans le canal ; `@canal` refusé."},"reply_to_id":{"oneOf":[{"type":"string","description":"Message auquel répondre."},{"type":"null"}]}},"required":["text"],"additionalProperties":false},"CreateTicketRequest":{"type":"object","properties":{"title":{"type":"string","description":"Titre."},"type":{"enum":["epic","story","task","bug","subtask"],"description":"Type ; `task` par défaut."},"priority":{"enum":["low","medium","high","critical"],"description":"Priorité."},"assignee_id":{"type":"string","description":"Personne assignée."},"description":{"type":"string","description":"Description en Markdown."},"due_date":{"type":"string","description":"Échéance, `AAAA-MM-JJ`.","format":"date"},"labels":{"type":"array","items":{"type":"string"}}},"required":["title"],"additionalProperties":false},"UpdateTicketRequest":{"type":"object","description":"Au moins un champ. Les champs sont appliqués dans l'ordre du corps ; à la première erreur, la réponse dit ce qui a déjà été appliqué (`applied`).","properties":{"status":{"enum":["todo","in_progress","in_review","done"],"description":"Nouveau statut."},"assignee_id":{"oneOf":[{"type":"string","description":"Nouvelle personne assignée ; `null` pour retirer l'assignation."},{"type":"null"}]},"priority":{"enum":["low","medium","high","critical"],"description":"Nouvelle priorité."},"title":{"type":"string","description":"Nouveau titre."},"description":{"oneOf":[{"type":"string","description":"Nouvelle description ; `null` pour l'effacer."},{"type":"null"}]},"sprint_id":{"oneOf":[{"type":"string","description":"Nouveau sprint ; `null` pour retirer le ticket du sprint."},{"type":"null"}]}},"minProperties":1,"additionalProperties":false},"CreateCommentRequest":{"type":"object","properties":{"text":{"type":"string","description":"Texte en Markdown."}},"required":["text"],"additionalProperties":false},"CreateWebhookRequest":{"type":"object","properties":{"url":{"type":"string","description":"Adresse HTTPS qui reçoit les événements ; elle doit être joignable depuis Synkro.","format":"uri"},"events":{"type":"array","items":{"$ref":"#/components/schemas/EventType"},"minItems":1,"description":"Types d'événements demandés."},"channel_ids":{"type":"array","items":{"type":"string"},"description":"Canaux suivis, parmi ceux de la clé ; absent : tous les canaux ouverts."}},"required":["url","events"],"additionalProperties":false}},"parameters":{"ChannelId":{"name":"channel_id","in":"path","required":true,"description":"Identifiant d'un canal ouvert à la clé. Un canal hors de portée répond comme un canal inconnu (`404`).","schema":{"type":"string"}},"TicketKey":{"name":"key","in":"path","required":true,"description":"Clé du ticket (`ACME-42`).","schema":{"type":"string"}},"WebhookId":{"name":"id","in":"path","required":true,"description":"Identifiant d'un abonnement de cette intégration.","schema":{"type":"string"}},"Limit":{"name":"limit","in":"query","description":"Taille de la page : 20 par défaut, 100 au plus.","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},"MessagesLimit":{"name":"limit","in":"query","description":"Taille de la page : 20 par défaut, 50 au plus.","schema":{"type":"integer","minimum":1,"maximum":50,"default":20}},"Cursor":{"name":"cursor","in":"query","description":"Curseur `next_cursor` de la page précédente. Opaque, propre à la route qui l'a émis : un curseur invalide ou venu d'une autre route répond `400 validation`.","schema":{"type":"string"}},"IdempotencyKey":{"name":"Idempotency-Key","in":"header","description":"Clé d'idempotence (1 à 128 caractères imprimables) : le même appel rejoué dans les 24 h renvoie la première réponse avec `Idempotent-Replayed: true`. Même clé encore en cours : `409 conflict` ; même clé pour une autre opération : `422 validation`. Absente : pas d'idempotence.","schema":{"type":"string","minLength":1,"maxLength":128}}},"headers":{"Synkro-Request-Id":{"description":"Identifiant de la requête (`req_…`), repris dans les erreurs et les journaux.","schema":{"type":"string","pattern":"^req_"}},"RateLimit-Limit":{"description":"Nombre de requêtes par minute permis à l'intégration (120).","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Jetons restants dans le seau de l'intégration.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Secondes avant le prochain jeton.","schema":{"type":"integer"}},"Retry-After":{"description":"Secondes à attendre avant de réessayer (réponse 429).","schema":{"type":"integer"}},"Idempotent-Replayed":{"description":"`true` quand la réponse est celle d'un premier appel avec la même `Idempotency-Key` ; rien n'a été recréé.","schema":{"type":"string","enum":["true"]}},"WWW-Authenticate":{"description":"`Bearer realm=\"synkro-api\"`, avec `error=\"invalid_token\"` si un jeton était présent.","schema":{"type":"string"}}},"responses":{"Validation":{"description":"`validation` : JSON invalide, champ manquant, en trop ou mal typé, paramètre hors limites, curseur invalide, ou valeur refusée par une règle (texte trop long, adresse non joignable). Une requête mal formée ne consomme pas le quota.","headers":{"Synkro-Request-Id":{"$ref":"#/components/headers/Synkro-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unauthenticated":{"description":"`unauthenticated` : jeton absent, inconnu, révoqué ou expiré, organisation en suppression ou intégration supprimée.","headers":{"Synkro-Request-Id":{"$ref":"#/components/headers/Synkro-Request-Id"},"WWW-Authenticate":{"$ref":"#/components/headers/WWW-Authenticate"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Forbidden":{"description":"`forbidden`, `plan_required`, `org_read_only` ou `org_suspended` : intégration désactivée ou suspendue, titulaire perdu, portée absente, offre insuffisante, organisation en lecture seule ou suspendue, ou requête portant un en-tête `Origin` (la clé n'a rien à faire dans un navigateur).","headers":{"Synkro-Request-Id":{"$ref":"#/components/headers/Synkro-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"`not_found` : ressource inconnue ou hors de portée de la clé (canal non ouvert, canal confidentiel, message privé) ; les deux cas sont indiscernables.","headers":{"Synkro-Request-Id":{"$ref":"#/components/headers/Synkro-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Conflict":{"description":"`conflict` : une opération est déjà en cours avec cette `Idempotency-Key`.","headers":{"Synkro-Request-Id":{"$ref":"#/components/headers/Synkro-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"ForbiddenOrigin":{"description":"`forbidden` : la requête porte un en-tête `Origin` (la clé n'a rien à faire dans un navigateur).","headers":{"Synkro-Request-Id":{"$ref":"#/components/headers/Synkro-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"PayloadTooLarge":{"description":"`payload_too_large` : corps de plus de 1 Mio.","headers":{"Synkro-Request-Id":{"$ref":"#/components/headers/Synkro-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unprocessable":{"description":"`validation` (clé d'idempotence déjà employée pour une autre opération) ou `limit_reached` (limite de l'offre atteinte, par exemple 10 abonnements par intégration).","headers":{"Synkro-Request-Id":{"$ref":"#/components/headers/Synkro-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"RateLimited":{"description":"`rate_limited` : 120 requêtes par minute et par intégration, 30 écritures par minute en plus (seaux à jetons).","headers":{"Synkro-Request-Id":{"$ref":"#/components/headers/Synkro-Request-Id"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"Retry-After":{"$ref":"#/components/headers/Retry-After"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Internal":{"description":"`internal` : erreur inattendue ; donne `request_id` au support.","headers":{"Synkro-Request-Id":{"$ref":"#/components/headers/Synkro-Request-Id"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}