Webhook events reference

Payload schemas for member.joined, member.approved, member.rejected, member.removed, and member.left events.

member.joined

Fired when a new member submits the join form. Status changes from null → PENDING if approval is required, or null → APPROVED if not.

Body fields

eventType · string

Always "member.joined".

eventId · string (UUID)

Idempotency key. Mirrors X-Event-Id.

occurredAt · string (ISO 8601)

When the member joined.

community · object

The community the event belongs to — { id, name }.

member · object

The person who joined. Includes id, fullName, email, phone, linkedinUrl, companyName, companyStage.

status · object

{ old, new } showing the status transition. For joined, old is null.

questions · array | null

Onboarding form answers, if the community has an onboarding flow. Each entry is { semantic_key, question, type, answer }.

Example body

JSON
{
  "eventType":  "member.joined",
  "eventId":    "evt_50b56daed0a3486fbe8350f9",
  "occurredAt": "2026-05-25T12:51:00.000Z",
  "community": {
    "id":   "a9e2f12c-7c8d-4b3f-b9c1-2d6e3f5a8b10",
    "name": "Founders Den"
  },
  "status": { "old": null, "new": "PENDING" },
  "member": {
    "id":           "mem_3f8c2b1aa7d44c0e9e1f",
    "fullName":     "Asha Verma",
    "email":        "asha@acme.io",
    "phone":        "+91-99887-72211",
    "linkedinUrl":  "https://www.linkedin.com/in/asha-verma",
    "companyName":  "Acme Labs",
    "companyStage": "seed"
  },
  "questions": [
    {
      "semantic_key": "why_joining",
      "question":     "Why are you joining?",
      "type":         "long_text",
      "answer":       "Looking to meet other early-stage founders."
    },
    {
      "semantic_key": "stage",
      "question":     "What stage is your company?",
      "type":         "single_choice",
      "answer":       "Seed"
    },
    {
      "semantic_key": "website",
      "question":     "What's your website?",
      "type":         "url",
      "answer":       "https://acme.io"
    }
  ]
}

member.approved

Fired when a pending member is approved by a moderator or admin. Status transitions from PENDING → APPROVED.

Example body

JSON
{
  "eventType":  "member.approved",
  "eventId":    "evt_b2f1a8d33e4b4f1aa4a1",
  "occurredAt": "2026-05-25T13:02:00.000Z",
  "community": { "id": "a9e2f12c-…", "name": "Founders Den" },
  "status":    { "old": "PENDING", "new": "APPROVED" },
  "actor":     { "id": "mem_…", "fullName": "Jorre R.", "role": "admin" },
  "member":    { "id": "mem_…", "fullName": "Asha Verma", "email": "asha@acme.io" }
}

member.rejected

Fired when a pending member is rejected. Status transitions from PENDING → REJECTED. Includes an optional reason string.

Example body

JSON
{
  "eventType":  "member.rejected",
  "eventId":    "evt_c79122eebaa8479ea7c0",
  "occurredAt": "2026-05-25T13:08:00.000Z",
  "community": { "id": "a9e2f12c-…", "name": "Founders Den" },
  "status":    { "old": "PENDING", "new": "REJECTED" },
  "actor":     { "id": "mem_…", "fullName": "Jorre R.", "role": "admin" },
  "member":    { "id": "mem_…", "fullName": "Asha Verma", "email": "asha@acme.io" },
  "reason":    "Off-topic application."
}

member.removed

Fired when an admin removes a member. Status transitions from APPROVED → REMOVED.

member.left

Fired when a member voluntarily leaves the community. Status transitions from APPROVED → LEFT. No actor field is included.

← Full webhooks reference · developers@key.ai