Webhooks

Get notified in real-time when reviews complete, team changes occur, or other events happen.

Overview

Jasper can send HTTP POST requests to your server when certain events occur. Use webhooks to integrate Jasper with your CI/CD pipeline, Slack, custom dashboards, or any other tools.

Available Events

Jasper supports 16 webhook events organized into 6 categories:

Review Events

Event Description
review.created A new code review has been queued
review.started AI analysis has started on a review
review.completed A code review has finished successfully
review.failed A review failed to complete

Repository Events

Event Description
repository.added A new repository was enabled for reviews
repository.removed A repository was disabled or removed
repository.settings_updated Repository settings were changed

Billing Events

Event Description
billing.credits_purchased Credits were purchased for the organization
billing.credits_low Credit balance is running low (below threshold)
billing.credits_depleted All credits have been used
billing.free_tier_reset Monthly free tier reviews have been reset

Team Events

Event Description
team.member_added A new member joined the organization
team.member_removed A member was removed from the organization
team.member_role_changed A member's role was updated

Security Events

Event Description
security.alert_created A security vulnerability was detected in a review
security.alert_resolved A security alert was marked as resolved

Organization Events

Event Description
organization.settings_updated Organization settings were changed

Payload Structure

All webhook payloads follow a consistent structure:

{
  "event": "review.completed",
  "timestamp": "2026-01-08T10:30:00Z",
  "organization": {
    "id": "org_abc123",
    "name": "Your Organization"
  },
  "data": {
    // Event-specific data
  }
}

Review Completed Example

{
  "event": "review.completed",
  "timestamp": "2026-01-08T10:30:00Z",
  "organization": {
    "id": "org_abc123",
    "name": "Your Organization"
  },
  "data": {
    "review_id": "rev_abc123",
    "repository": "org/repo",
    "pr_number": 42,
    "pr_title": "Add new feature",
    "verdict": "APPROVE",
    "score": 85,
    "summary": "Code looks good with minor suggestions...",
    "issues": {
      "critical": 0,
      "high": 1,
      "medium": 2,
      "low": 5
    },
    "url": "https://heyjasper.ai/reviews/rev_abc123"
  }
}

Team Member Added Example

{
  "event": "team.member_added",
  "timestamp": "2026-01-08T10:30:00Z",
  "organization": {
    "id": "org_abc123",
    "name": "Your Organization"
  },
  "data": {
    "user": {
      "id": "usr_xyz789",
      "name": "Jane Developer",
      "email": "[email protected]",
      "github_username": "janedev"
    },
    "role": "member",
    "invited_by": {
      "id": "usr_abc123",
      "name": "John Admin"
    }
  }
}

Setting Up Webhooks

  1. Go to your organization Settings
  2. Navigate to Webhooks
  3. Click Add Webhook
  4. Enter your endpoint URL (must be HTTPS)
  5. Select the events you want to receive
  6. Optionally add a description
  7. Save the webhook

Tip: You can create multiple webhooks with different event subscriptions to route events to different endpoints.

Security

All webhook requests include a signature header for verification. This ensures requests are genuinely from Jasper and haven't been tampered with.

Signature Header

X-Jasper-Signature: sha256=abc123def456...

Verifying Signatures

Verify the signature using your webhook secret (found in webhook settings):

// PHP Example
$payload = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_REVIO_SIGNATURE'];
$secret = 'your-webhook-secret';

$expected = 'sha256=' . hash_hmac('sha256', $payload, $secret);

if (!hash_equals($expected, $signature)) {
    http_response_code(401);
    exit('Invalid signature');
}

// Process the webhook
$data = json_decode($payload, true);
// Node.js Example
const crypto = require('crypto');

function verifySignature(payload, signature, secret) {
    const expected = 'sha256=' +
        crypto.createHmac('sha256', secret)
              .update(payload)
              .digest('hex');

    return crypto.timingSafeEqual(
        Buffer.from(expected),
        Buffer.from(signature)
    );
}

Retry Policy

If your endpoint returns an error (non-2xx status code), Jasper will retry the delivery:

  • 3 retry attempts before marking as failed
  • Exponential backoff: 1 second, 10 seconds, 60 seconds
  • Timeout: 30 seconds per request

Delivery Logs

View delivery history and debug failed webhooks in Settings → Webhooks → Logs. Each delivery shows:

  • Request payload
  • Response status and body
  • Retry attempts
  • Timestamps

Best Practices

  • Respond quickly — Return a 200 response within 5 seconds, then process asynchronously
  • Handle duplicates — Use the event ID to deduplicate in case of retries
  • Verify signatures — Always validate the X-Jasper-Signature header
  • Use HTTPS — Only HTTPS endpoints are supported for security
  • Monitor delivery logs — Regularly check for failed deliveries

Testing Webhooks

Use the Test button in webhook settings to send a test payload to your endpoint. This helps verify your integration before going live.

For complete API documentation, see the API Reference.