RamenIDDocs

Webhook events

Every field RamenID sends to your webhook, and the headers on each request.

How to set up and verify webhooks is in the Webhooks guide. This page is the field reference.

Headers

RamenID-Signature
string
t=<unix seconds>,v1=<hex HMAC-SHA256 of "{t}.{raw body}"> keyed with your signing secret.
Content-Type
string
application/json
User-Agent
string
RamenID-Webhooks/1

Envelope

id
string (UUID)
Unique per event. The same on every retry, so use it to ignore duplicates.
type
"student.verified" | "discount.minted"
What happened.
created_at
string
When the event was created, ISO 8601 UTC.
data
object
Details, below.

data

verification_id
string (UUID)
The verification this event is about.
link_id
string (UUID) | null
The API link's id, matching the id from Create a link. null for rule links and your workspace page.
email
string
The verified email, lowercased, with plus addressing removed (ana+x@mit.edu becomes ana@mit.edu).
domain
string
The school domain that matched, like mit.edu. For a subdomain address this is the matched parent domain.
institution
string | null
The school's name when we know it.
product_name
string | null
The rule's product when the verification started. null for verification only.
coupon
object | null
Set on discount.minted, null on student.verified.
coupon.code
string
The single-use code.
coupon.percent_off
number
Percent off, as the code was created. Editing the rule later does not change it.
coupon.expires_at
string | null
When the code stops working.
coupon.checkout_url
string | null
Checkout with the code applied, when available.

student.verified

Sent when a verification-only flow finishes: your workspace page, or an API link set to verification only.

{
  "id": "2b7c1f4e-8a3d-4e6b-9c2f-5d1a0e8b7c63",
  "type": "student.verified",
  "created_at": "2026-10-19T18:02:11.000Z",
  "data": {
    "verification_id": "1f7a9c3e-5b2d-4e8f-a6c1-7d3b9e2f4a10",
    "link_id": "4b8f0c2e-7d1a-4c3b-9e2f-1a6d5c8b7e90",
    "email": "ana@mit.edu",
    "domain": "mit.edu",
    "institution": "Massachusetts Institute of Technology",
    "product_name": null,
    "coupon": null
  }
}

discount.minted

Sent when a student gets a discount code. On a rule link, only when a new code is created. On an API link, every time the link is completed, including when a returning student gets their existing code.

{
  "id": "9d2c4e1a-3b5f-4a7e-8c6d-2f1e0b9a8c7d",
  "type": "discount.minted",
  "created_at": "2026-10-19T18:02:11.000Z",
  "data": {
    "verification_id": "1f7a9c3e-5b2d-4e8f-a6c1-7d3b9e2f4a10",
    "link_id": null,
    "email": "ana@mit.edu",
    "domain": "mit.edu",
    "institution": "Massachusetts Institute of Technology",
    "product_name": "Notebook Pro",
    "coupon": {
      "code": "STUK7M2QX",
      "percent_off": 40,
      "expires_at": "2026-10-26T18:02:11.000Z",
      "checkout_url": "https://buy.stripe.com/test_123?prefilled_promo_code=STUK7M2QX"
    }
  }
}

Not sent

There are no events for a code being redeemed (RamenID cannot see your checkouts), for a link expiring, or for failed attempts. Check your provider for redemptions, and Get a link for link status.