Documentation
Webhooks

Event Reference

Complete payload reference for every Tenpace webhook event.

GitHub Events

These events mirror GitHub webhook actions. They fire immediately when the corresponding GitHub action occurs.

pr.opened

Fired when a pull request is opened or marked ready for review (converted from draft).

{
  "event": "pr.opened",
  "timestamp": "2025-06-01T10:23:00.000Z",
  "data": {
    "repo": {
      "full_name": "acme/backend",
      "url": "https://github.com/acme/backend"
    },
    "pull_request": {
      "number": 142,
      "title": "feat: add rate limiting middleware",
      "author": "alice",
      "url": "https://github.com/acme/backend/pull/142",
      "state": "open",
      "draft": false,
      "reviewers": ["bob", "charlie"],
      "additions": 87,
      "deletions": 12
    }
  }
}

pr.merged

Fired when a pull request is merged.

{
  "event": "pr.merged",
  "timestamp": "2025-06-01T14:05:00.000Z",
  "data": {
    "repo": { "full_name": "acme/backend", "url": "https://github.com/acme/backend" },
    "pull_request": {
      "number": 142,
      "title": "feat: add rate limiting middleware",
      "author": "alice",
      "url": "https://github.com/acme/backend/pull/142",
      "state": "closed",
      "merged": true
    }
  }
}

pr.closed

Fired when a pull request is closed without merging.

{
  "event": "pr.closed",
  "timestamp": "2025-06-01T14:05:00.000Z",
  "data": {
    "repo": { "full_name": "acme/backend", "url": "https://github.com/acme/backend" },
    "pull_request": {
      "number": 143,
      "title": "wip: experimental feature",
      "author": "dave",
      "url": "https://github.com/acme/backend/pull/143",
      "state": "closed",
      "merged": false
    }
  }
}

pr.review_submitted

Fired when a reviewer submits their review (approved, changes requested, or commented).

{
  "event": "pr.review_submitted",
  "timestamp": "2025-06-01T11:30:00.000Z",
  "data": {
    "repo": { "full_name": "acme/backend", "url": "https://github.com/acme/backend" },
    "pull_request": {
      "number": 142,
      "title": "feat: add rate limiting middleware",
      "author": "alice",
      "url": "https://github.com/acme/backend/pull/142"
    },
    "review": {
      "reviewer": "bob",
      "state": "APPROVED",
      "body": "Looks great, ship it!"
    }
  }
}

The state field can be APPROVED, CHANGES_REQUESTED, or COMMENTED.

pr.review_requested

Fired when a reviewer is added to a pull request.

{
  "event": "pr.review_requested",
  "timestamp": "2025-06-01T10:25:00.000Z",
  "data": {
    "repo": { "full_name": "acme/backend", "url": "https://github.com/acme/backend" },
    "pull_request": {
      "number": 142,
      "title": "feat: add rate limiting middleware",
      "author": "alice",
      "url": "https://github.com/acme/backend/pull/142",
      "state": "open",
      "reviewers": ["bob", "charlie"]
    }
  }
}

pr.ci_status

Fired when a CI check suite completes on a pull request.

{
  "event": "pr.ci_status",
  "timestamp": "2025-06-01T10:45:00.000Z",
  "data": {
    "repo": { "full_name": "acme/backend", "url": "https://github.com/acme/backend" },
    "pull_request": {
      "number": 142,
      "title": "feat: add rate limiting middleware",
      "url": "https://github.com/acme/backend/pull/142"
    },
    "conclusion": "success",
    "check_suite_id": 123456789
  }
}
Tenpace Workflow Events

These events are computed by Tenpace and do not exist in GitHub's webhook API. They give you insight into the state of your review process that would otherwise require polling and complex logic to derive.

pr.ready_to_merge

Fired when the last requested reviewer approves, tipping the PR into a fully-approved state and all CI checks are passing. This is the signal to trigger automated merge workflows, notify the author, or update your project tracker.

Fired at most once per PR review cycle. If new commits are pushed after approval, the event may fire again once all reviewers re-approve.
{
  "event": "pr.ready_to_merge",
  "timestamp": "2025-06-01T13:55:00.000Z",
  "data": {
    "repo": { "full_name": "acme/backend", "url": "https://github.com/acme/backend" },
    "pull_request": {
      "number": 142,
      "title": "feat: add rate limiting middleware",
      "author": "alice",
      "url": "https://github.com/acme/backend/pull/142"
    },
    "approvals": ["bob", "charlie"],
    "ci_status": "success"
  }
}

pr.attention_needed

Fired by the periodic workflow check when a PR has been open with no review activity for more than the configured threshold (default: 4 hours). Useful for alerting authors that their PR may have fallen through the cracks.

{
  "event": "pr.attention_needed",
  "timestamp": "2025-06-02T08:00:00.000Z",
  "data": {
    "repo": { "full_name": "acme/backend", "url": "https://github.com/acme/backend" },
    "pull_request": {
      "number": 139,
      "title": "fix: null pointer in user resolver",
      "author": "charlie",
      "url": "https://github.com/acme/backend/pull/139",
      "reviewers": ["alice", "bob"]
    },
    "hours_open_without_activity": 6,
    "threshold_hours": 4
  }
}

review.round_complete

Fired when every requested reviewer has submitted their review (any state: approved, changes requested, or commented). This signals that a full round of feedback is in. The PR author now has everything they need to iterate.

{
  "event": "review.round_complete",
  "timestamp": "2025-06-01T13:55:00.000Z",
  "data": {
    "repo": { "full_name": "acme/backend", "url": "https://github.com/acme/backend" },
    "pull_request": {
      "number": 142,
      "title": "feat: add rate limiting middleware",
      "author": "alice",
      "url": "https://github.com/acme/backend/pull/142"
    },
    "reviews": [
      { "reviewer": "bob", "state": "APPROVED" },
      { "reviewer": "charlie", "state": "CHANGES_REQUESTED" }
    ]
  }
}

review.sla_breached

Fired by the periodic workflow check for each reviewer who has been requested but hasn't submitted a review within the team's SLA window (default: 24 hours, configurable via team settings). One event is fired per reviewer per SLA breach check.

This event fires periodically (not once). If you use it to send notifications, track the delivery ID or last-notified time to avoid spamming reviewers.
{
  "event": "review.sla_breached",
  "timestamp": "2025-06-02T08:00:00.000Z",
  "data": {
    "repo": { "full_name": "acme/backend", "url": "https://github.com/acme/backend" },
    "pull_request": {
      "number": 142,
      "title": "feat: add rate limiting middleware",
      "author": "alice",
      "url": "https://github.com/acme/backend/pull/142"
    },
    "reviewer": "charlie",
    "hours_elapsed": 28,
    "sla_threshold_hours": 24
  }
}