Connecteur Linear
Connectez votre workspace Linear à Brevo pour le suivi des issues côté client, les notifications de mises à jour produit et les campagnes de jalons de développement via Tajo.
Vue d’ensemble
| Propriété | Valeur |
|---|---|
| Plateforme | Linear |
| Catégorie | Custom |
| Complexité d’installation | Facile |
| Intégration officielle | Non |
| Données synchronisées | Issues, projets, utilisateurs, événements |
| Type d’API | API GraphQL |
| Authentification | OAuth 2.0 / Personal API Key |
| URL de base | https://api.linear.app/graphql |
Fonctionnalités
- Synchronisation d’événements issue, Transférez les événements de création, mise à jour et clôture d’issues vers les timelines de contacts Brevo
- Suivi des jalons de projet, Déclenchez des campagnes Brevo lorsque les projets atteignent des jalons clés
- Liaison issues-clients, Associez les issues Linear aux contacts Brevo pour la visibilité support
- Segmentation basée sur les labels, Mappez les labels Linear aux attributs de contact Brevo
- Analytics de cycles, Synchronisez les données de clôture de sprint/cycle pour le reporting de performance d’équipe
- Automatisation pilotée par webhook, Transfert d’événements en temps réel via les webhooks Linear
Prérequis
Avant de commencer, assurez-vous de disposer de :
- Un workspace Linear avec accès admin
- Une Personal API key ou application OAuth configurée
- Un compte Brevo avec accès API
- Un compte Tajo avec un abonnement actif
Authentification
Linear prend en charge les Personal API keys et OAuth 2.0.
Option 1 : Personal API Key
- Allez dans Linear > Settings > API > Personal API keys
- Cliquez sur Create key
- Nommez-la « Tajo Integration »
- Copiez la clé générée (commence par
lin_api_)
curl -X POST https://api.linear.app/graphql \ -H "Authorization: $LINEAR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"query": "{ viewer { id name email } }"}'Option 2 : OAuth 2.0
Pour les intégrations servant plusieurs workspaces :
- Créez une application OAuth sur linear.app/settings/api/applications
- Configurez l’URI de redirection :
https://app.tajo.io/callbacks/linear - Demandez les scopes :
read,write,issues:create,comments:create
API GraphQL
Linear utilise exclusivement une API GraphQL. Toutes les queries et mutations passent par un endpoint unique : https://api.linear.app/graphql. Tajo gère automatiquement la construction des requêtes GraphQL.
Connexion à Tajo
# Avec Personal API Keytajo connectors install linear \ --api-key $LINEAR_API_KEY
# Avec OAuthtajo connectors install linear \ --client-id $LINEAR_CLIENT_ID \ --client-secret $LINEAR_CLIENT_SECRETConfiguration
Configuration de base
connectors: linear: enabled: true
sync: issues: true projects: true cycles: true users: true
teams: - key: "ENG" sync_to_list: 38 - key: "SUPPORT" sync_to_list: 39
issue_states: - Backlog - Todo - "In Progress" - Done - CanceledMappage des champs
Mappez les données utilisateur et issue Linear vers les attributs Brevo :
field_mapping: # Champs utilisateur id: LINEAR_USER_ID email: email name: FIRSTNAME
# Métriques d'issue mappées vers des événements de contact last_issue_identifier: LAST_LINEAR_ISSUE last_issue_state: LAST_ISSUE_STATUS last_issue_priority: LAST_ISSUE_PRIORITY total_issues: LINEAR_ISSUE_COUNT
# Données de projet current_project: ACTIVE_PROJECT team_key: LINEAR_TEAMMappage des événements
event_mapping: Issue.create: ISSUE_CREATED Issue.update: ISSUE_UPDATED Issue.remove: ISSUE_DELETED Comment.create: COMMENT_ADDED Project.update: PROJECT_UPDATED Cycle.update: CYCLE_UPDATEDEndpoints API
Linear utilise un endpoint GraphQL unique. Principales queries et mutations utilisées par Tajo :
| Opération | Type | Objet |
|---|---|---|
issues | Query | Lister et filtrer les issues |
issue | Query | Obtenir une issue par ID |
projects | Query | Lister tous les projets |
cycles | Query | Lister les cycles (sprints) |
teams | Query | Lister les équipes du workspace |
users | Query | Lister les membres du workspace |
viewer | Query | Obtenir les infos de l’utilisateur authentifié |
issueCreate | Mutation | Créer une nouvelle issue |
issueUpdate | Mutation | Mettre à jour une issue existante |
commentCreate | Mutation | Ajouter un commentaire à une issue |
webhookCreate | Mutation | Enregistrer un webhook |
Exemple de requête GraphQL
query GetIssues($filter: IssueFilter, $first: Int, $after: String) { issues(filter: $filter, first: $first, after: $after) { nodes { id identifier title state { name } priority assignee { email name } labels { nodes { name } } createdAt updatedAt } pageInfo { hasNextPage endCursor } }}Exemples de code
Initialiser le connecteur
import { TajoClient } from '@tajo/sdk';
const tajo = new TajoClient({ apiKey: process.env.TAJO_API_KEY, brevoApiKey: process.env.BREVO_API_KEY});
await tajo.connectors.connect('linear', { apiKey: process.env.LINEAR_API_KEY});Synchroniser les issues
await tajo.connectors.sync('linear', { type: 'incremental', resources: ['issues'], teams: ['ENG', 'SUPPORT'], since: '2024-01-01'});
const status = await tajo.connectors.status('linear');console.log(status);// {// connected: true,// lastSync: '2024-03-15T18:00:00Z',// issuesTracked: 3200,// projectsMonitored: 8,// usersLinked: 45// }Gérer les webhooks Linear
app.post('/webhooks/linear', async (req, res) => { const event = req.body;
// Vérifier la signature du webhook const signature = req.get('Linear-Signature'); if (!verifyLinearSignature(req.body, signature)) { return res.status(401).send('Unauthorized'); }
await tajo.connectors.handleWebhook('linear', { type: event.type, action: event.action, payload: { issueId: event.data?.id, identifier: event.data?.identifier, title: event.data?.title, state: event.data?.state?.name, assigneeEmail: event.data?.assignee?.email } });
res.status(200).send('OK');});Créer une issue depuis un événement Brevo
// Créer une issue Linear lorsqu'un contact Brevo soumet une demandetajo.events.on('contact.event', async (event) => { if (event.name === 'FEATURE_REQUEST') { await tajo.connectors.create('linear', { teamId: 'ENG', title: `Feature Request: ${event.data.subject}`, description: event.data.description, priority: 3, labelIds: ['feature-request'] }); }});Limites de débit
Linear impose des limites de débit sur son API GraphQL :
| Type de limite | Valeur |
|---|---|
| Débit de requêtes | 1 500 requêtes par heure par clé API |
| Complexité de requête | 10 000 points de complexité par requête |
| Pagination | 250 nœuds max par page (50 par défaut) |
| Webhooks | Événements entrants illimités |
Budget de complexité
Linear utilise un système de limitation basé sur la complexité. Les requêtes simples coûtent moins de points. Tajo optimise les requêtes pour minimiser la complexité en ne demandant que les champs nécessaires et en utilisant une pagination efficace.
Linear renvoie 429 Too Many Requests avec un en-tête Retry-After lorsque les limites sont dépassées.
Dépannage
Problèmes courants
| Problème | Cause | Solution |
|---|---|---|
| 401 Unauthorized | Clé API invalide ou révoquée | Générez une nouvelle clé API dans les Settings Linear |
| Erreurs de requête | Syntaxe GraphQL invalide | Validez les requêtes avec l’API explorer de Linear |
| Issues manquantes | Accès aux équipes restreint | Assurez-vous que le propriétaire de la clé API a accès aux équipes cibles |
| Webhook qui ne se déclenche pas | URL incorrecte ou désactivé | Vérifiez le statut du webhook dans Linear Settings > API > Webhooks |
| Pagination incomplète | Curseur after manquant | Assurez-vous que la boucle de pagination continue jusqu’à ce que hasNextPage soit false |
Mode debug
connectors: linear: debug: true log_level: verbose log_queries: trueTester la connexion
tajo connectors test linear# ✓ GraphQL API connection successful# ✓ Workspace access verified# ✓ Team list readable# ✓ Issue query operational# ✓ Webhook registration availableBonnes pratiques
- Utilisez les webhooks pour le temps réel, Enregistrez des webhooks plutôt que d’interroger les changements d’issues
- Filtrez par équipe, Synchronisez uniquement les issues des équipes pertinentes pour réduire l’usage API
- Optimisez les requêtes GraphQL, Ne demandez que les champs nécessaires pour rester sous les limites de complexité
- Mappez les labels vers des segments, Utilisez les labels Linear pour piloter la segmentation des contacts Brevo
- Gérez la pagination, Vérifiez toujours
hasNextPageet utilisezendCursorpour des données complètes - Vérifiez les signatures de webhook, Validez toujours l’en-tête
Linear-Signature
Sécurité
- Authentification par clé API, Clés personnelles limitées au workspace
- OAuth 2.0, Flux d’autorisation sécurisé pour les intégrations multi-workspaces
- HTTPS uniquement, Toutes les communications API chiffrées via TLS 1.2+
- Signatures des webhooks, Vérification de signature basée sur HMAC
- Stockage chiffré, Clés API chiffrées au repos dans Tajo
- Conformité SOC 2, La plateforme Linear est certifiée SOC 2 Type II