Вебхуки

Когда ты создаёшь агента с URL вебхука, Cursor будет отправлять HTTP POST-запросы, чтобы уведомлять тебя об изменениях статуса. Сейчас поддерживаются только события statusChange — когда агент переходит в состояния ERROR или FINISHED.

Проверка вебхука

Чтобы убедиться, что запросы вебхука действительно поступают от Cursor, проверь подпись, включённую в каждый запрос:

Заголовки

Каждый запрос вебхука содержит следующие заголовки:
  • X-Webhook-Signature – содержит подпись HMAC-SHA256 в формате sha256=<hex_digest>
  • X-Webhook-ID – уникальный идентификатор этой доставки (полезно для логирования)
  • X-Webhook-Event – тип события (сейчас только statusChange)
  • User-Agent – всегда Cursor-Agent-Webhook/1.0

Проверка подписи

Чтобы проверить подпись вебхука, вычисли ожидаемую подпись и сравни её с полученной:
const crypto = require('crypto');

function verifyWebhook(secret, rawBody, signature) {
  const expectedSignature = 'sha256=' + 
    crypto.createHmac('sha256', secret)
          .update(rawBody)
          .digest('hex');
  
  return signature === expectedSignature;
}
import hmac
import hashlib

def verify_webhook(secret, raw_body, signature):
    expected_signature = 'sha256=' + hmac.new(
        secret.encode(),
        raw_body,
        hashlib.sha256
    ).hexdigest()
    
    return signature == expected_signature
Всегда используй «сырое» тело запроса (до любого парсинга) при вычислении подписи.

Формат полезной нагрузки

Полезная нагрузка вебхука отправляется в формате JSON со следующей структурой:
{
  "event": "statusChange",
  "timestamp": "2024-01-15T10:30:00Z",
  "id": "bc_abc123",
  "status": "FINISHED",
  "source": {
    "repository": "https://github.com/your-org/your-repo",
    "ref": "main"
  },
  "target": {
    "url": "https://cursor.com/agents?id=bc_abc123",
    "branchName": "cursor/add-readme-1234",
    "prUrl": "https://github.com/your-org/your-repo/pull/1234"
  },
  "summary": "Added README.md with installation instructions"
}
Обрати внимание: некоторые поля необязательны и будут включены только при наличии.

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

  • Проверяй подписи – Всегда проверяй подпись вебхука, чтобы убедиться, что запрос от Cursor
  • Обрабатывай повторы – Вебхуки могут быть отправлены повторно, если твой endpoint возвращает код ошибки
  • Отвечай быстро – Возвращай статус 2xx как можно скорее
  • Используй HTTPS – Всегда используй HTTPS-URL для endpointов вебхуков в проде
  • Сохраняй сырой payload – Храни сырой payload вебхука для отладки и последующей проверки