---
title: "Коннектор Linear"
description: "Полное руководство по интеграции Linear для синхронизации задач, проектов и активности команды с Brevo через Tajo."
url: https://tajo.io/ru/docs/connectors/custom/linear/
markdown: https://tajo.io/ru/docs/connectors/custom/linear.md
lang: ru-RU
robots: noindex
---

Подайте заявку на ранний доступ

Укажите имя и рабочий адрес электронной почты. Мы отправим ссылку для подтверждения запроса на доступ к Tajo.

# Коннектор Linear

Статус коннектора: Запланирован Ещё не создан. Сегодня Tajo не запускает этот коннектор.

| Поле источника | Поле назначения | Пример значения |
| --- | --- | --- |
| `record.id` | `source_id` | `record_1042` |
| `record.updated_at` | `updated_at` | `2026-10-18T08:00:00Z` |
| `record.value` | `value` | `sample_value` |

Подключите ваш рабочий проект Linear к Brevo для отслеживания задач, ориентированных на клиентов, уведомлений об обновлениях продукта и кампаний по вехам разработки через Tajo.

## Обзор

| Свойство | Значение |
| --- | --- |
| **Платформа** | Linear |
| **Категория** | Custom |
| **Сложность настройки** | Простая |
| **Официальная интеграция** | Нет |
| **Синхронизируемые данные** | Задачи, проекты, пользователи, события |
| **Тип API** | GraphQL API |
| **Аутентификация** | OAuth 2.0 / Personal API Key |
| **Базовый URL** | `https://api.linear.app/graphql` |

## Возможности

- **Синхронизация событий задач**, пересылка событий создания, обновления и завершения задач в хронологию контактов Brevo
- **Отслеживание вех проекта**, запуск кампаний Brevo при достижении ключевых вех проекта
- **Привязка задач к клиентам**, связывание задач Linear с контактами Brevo для видимости поддержки
- **Сегментация по меткам**, сопоставление меток Linear с атрибутами контактов Brevo
- **Аналитика циклов**, синхронизация данных о завершении спринтов/циклов для отчётности о производительности команды
- **Автоматизация на основе вебхуков**, пересылка событий в real-time через вебхуки Linear

## Предварительные требования

Прежде чем начать, убедитесь, что у вас есть:

1. Рабочий проект Linear с правами администратора
2. Personal API key или настроенное OAuth-приложение
3. Аккаунт Brevo с доступом к API
4. Аккаунт Tajo с активной подпиской

## Аутентификация

Linear поддерживает Personal API keys и OAuth 2.0.

### Вариант 1: Personal API Key

1. Перейдите в **Linear** > **Settings** > **API** > **Personal API keys**
2. Нажмите **Create key**
3. Назовите ключ “Tajo Integration”
4. Скопируйте сгенерированный ключ (начинается с `lin_api_`)

```bash
curl -X POST https://api.linear.app/graphql \
  -H "Authorization: $LINEAR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query": "{ viewer { id name email } }"}'
```

### Вариант 2: OAuth 2.0

Для интеграций, обслуживающих несколько рабочих проектов:

1. Создайте OAuth-приложение на [linear.app/settings/api/applications](https://linear.app/settings/api/applications)
2. Укажите redirect URI: `https://app.tajo.io/callbacks/linear`
3. Запросите scope: `read`, `write`, `issues:create`, `comments:create`

GraphQL API

Linear использует исключительно GraphQL API. Все запросы и мутации проходят через единственный эндпоинт: `https://api.linear.app/graphql`. Tajo автоматически строит все GraphQL-запросы.

### Подключение к Tajo

```bash
# Используя Personal API Key
tajo connectors install linear \
  --api-key $LINEAR_API_KEY

# Используя OAuth
tajo connectors install linear \
  --client-id $LINEAR_CLIENT_ID \
  --client-secret $LINEAR_CLIENT_SECRET
```

## Конфигурация

### Базовая настройка

```yaml
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
      - Canceled
```

### Сопоставление полей

Сопоставьте данные пользователей и задач Linear с атрибутами Brevo:

```yaml
field_mapping:
  # User fields
  id: LINEAR_USER_ID
  email: email
  name: FIRSTNAME

  # Issue metrics mapped to contact events
  last_issue_identifier: LAST_LINEAR_ISSUE
  last_issue_state: LAST_ISSUE_STATUS
  last_issue_priority: LAST_ISSUE_PRIORITY
  total_issues: LINEAR_ISSUE_COUNT

  # Project data
  current_project: ACTIVE_PROJECT
  team_key: LINEAR_TEAM
```

### Сопоставление событий

```yaml
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_UPDATED
```

## Эндпоинты API

Linear использует единственный GraphQL-эндпоинт. Ключевые запросы и мутации, используемые Tajo:

| Операция | Тип | Назначение |
| --- | --- | --- |
| `issues` | Query | Список и фильтрация задач |
| `issue` | Query | Получить задачу по ID |
| `projects` | Query | Список всех проектов |
| `cycles` | Query | Список циклов (спринтов) |
| `teams` | Query | Список команд рабочего проекта |
| `users` | Query | Список участников рабочего проекта |
| `viewer` | Query | Получить данные аутентифицированного пользователя |
| `issueCreate` | Mutation | Создать новую задачу |
| `issueUpdate` | Mutation | Обновить существующую задачу |
| `commentCreate` | Mutation | Добавить комментарий к задаче |
| `webhookCreate` | Mutation | Зарегистрировать вебхук |

### Пример GraphQL-запроса

```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
    }
  }
}
```

## Примеры кода

### Инициализация коннектора

```javascript
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
});
```

### Синхронизация задач

```javascript
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
// }
```

### Обработка вебхуков Linear

```javascript
app.post('/webhooks/linear', async (req, res) => {
  const event = req.body;

  // Проверка подписи вебхука
  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');
});
```

### Создание задачи из события Brevo

```javascript
// Создание задачи Linear при отправке запроса контактом Brevo
tajo.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']
    });
  }
});
```

## Ограничения скорости

Linear применяет ограничения к своему GraphQL API:

| Тип лимита | Значение |
| --- | --- |
| **Частота запросов** | 1 500 запросов в час на API key |
| **Сложность запроса** | 10 000 очков сложности на запрос |
| **Пагинация** | Максимум 250 узлов на страницу (по умолчанию 50) |
| **Вебхуки** | Неограниченное количество входящих событий |

Бюджет сложности

Linear использует систему ограничения скорости на основе сложности. Простые запросы стоят меньше очков. Tajo оптимизирует запросы для минимизации сложности, запрашивая только нужные поля и используя эффективную пагинацию.

Linear возвращает `429 Too Many Requests` с заголовком `Retry-After` при превышении лимитов.

## Устранение неполадок

### Частые проблемы

| Проблема | Причина | Решение |
| --- | --- | --- |
| 401 Unauthorized | Недействительный или отозванный API key | Сгенерируйте новый API key в настройках Linear |
| Ошибки запросов | Неверный синтаксис GraphQL | Проверьте запросы в API explorer Linear |
| Отсутствующие задачи | Ограниченный доступ к команде | Убедитесь, что владелец API key имеет доступ к целевым командам |
| Вебхук не срабатывает | Неверный URL или отключён | Проверьте статус вебхука в Linear Settings > API > Webhooks |
| Неполная пагинация | Отсутствует курсор `after` | Убедитесь, что цикл пагинации продолжается до `hasNextPage` = false |

### Режим отладки

```yaml
connectors:
  linear:
    debug: true
    log_level: verbose
    log_queries: true
```

### Проверка подключения

```bash
tajo connectors test linear
# ✓ GraphQL API connection successful
# ✓ Workspace access verified
# ✓ Team list readable
# ✓ Issue query operational
# ✓ Webhook registration available
```

## Лучшие практики

1. **Используйте вебхуки для real-time**, регистрируйте вебхуки вместо опроса API для изменений задач
2. **Фильтруйте по команде**, синхронизируйте только задачи из нужных команд для снижения нагрузки на API
3. **Оптимизируйте GraphQL-запросы**, запрашивайте только нужные поля, чтобы оставаться в пределах лимитов сложности
4. **Сопоставляйте метки с сегментами**, используйте метки Linear для сегментации контактов в Brevo
5. **Обрабатывайте пагинацию**, всегда проверяйте `hasNextPage` и используйте `endCursor` для получения полных данных
6. **Проверяйте подписи вебхуков**, всегда валидируйте заголовок `Linear-Signature`

## Безопасность

- **Аутентификация по API Key**, персональные ключи, привязанные к рабочему проекту
- **OAuth 2.0**, безопасный поток авторизации для интеграций с несколькими рабочими проектами
- **Только HTTPS**, все API-коммуникации зашифрованы через TLS 1.2+
- **Подписи вебхуков**, верификация подписи на основе HMAC
- **Шифрованное хранение**, API ключи зашифрованы при хранении в Tajo
- **Соответствие SOC 2**, платформа Linear сертифицирована по SOC 2 Type II

## Связанные ресурсы

- [Коннектор GitHub](https://tajo.io/ru/docs/connectors/custom/github)
- [Коннектор Jira](https://tajo.io/ru/docs/connectors/custom/jira)
- [Коннектор Notion](https://tajo.io/ru/docs/connectors/custom/notion)
- [Brevo Contacts API](https://tajo.io/ru/docs/contact-management)
