POST request containing the event data to an address you configure (the "target URL").Note: The app's user interface is in German; German labels are given in quotes where they help you locate an element.
Note: Webhooks are available from the Gold tier.
https address the data is sent to.⚠️ Important: The secret is shown in plain text only this one time. Copy it and store it securely – it is needed to verify the signature (see Verifying the signature). If you lose it, you can generate a new one at any time.
| Shown in the app | Value in the message | Triggered when … |
|---|---|---|
| "Antrag eingegangen" | ApplicationReceived | a new application (membership, change or cancellation) is received |
| "E-Mail (DOI) bestätigt" | EmailConfirmed | the applicant has confirmed their e-mail address |
| "Antrag akzeptiert" | ApplicationAccepted | an application was accepted |
| "Antrag abgelehnt" | ApplicationRejected | an application was rejected |
💡 The dashboard additionally offers a "Webhook-Zustellungen" (webhook deliveries) tile. It shows successful and failed deliveries over time – either across all webhooks or per webhook.
POST request with a JSON body and several headers.| Header | Meaning |
|---|---|
X-Vereinsantrag-Event | The event type, e.g. ApplicationReceived. |
X-Vereinsantrag-Delivery | Unique ID of this delivery – ideal for detecting retries. |
X-Vereinsantrag-Timestamp | Time the signature was created, as a Unix timestamp (seconds). |
X-Vereinsantrag-Signature | Signature of the message in the form sha256=<hex> (see below). |
{
"event": "ApplicationReceived",
"occurredAt": "2026-06-26T08:30:00Z",
"clubId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"submission": {
"id": "9b2c7d10-1f4e-4a2b-8c33-0a1b2c3d4e5f",
"type": "SubmitMemberships",
"state": "New",
"firstname": "Max",
"lastname": "Mustermann",
"email": "max@example.com",
"dateCreate": "2026-06-26T08:29:55Z",
"confirmDate": null
}
}submission object:type – kind of application: SubmitMemberships (membership), SubmitChanges (change) or SubmitCancellations (cancellation).state – current status: New (submitted), NewNotConfirmed (submitted, e-mail not yet confirmed), Proceeded (accepted and processed) or Rejected (rejected).confirmDate – time the e-mail address was confirmed, or null if not (yet) confirmed.X-Vereinsantrag-Timestamp header (timestamp) and X-Vereinsantrag-Signature."<timestamp>.<raw-body>" – i.e. the timestamp, a dot, then the unmodified JSON body you received.sha256=.X-Vereinsantrag-Signature (use a constant-time comparison).Always use the raw, unmodified body. If the JSON is parsed and re-serialized, the signature changes.
Optional but recommended: reject messages whose X-Vereinsantrag-Timestampis too far in the past (e.g. older than 5 minutes) to prevent replaying old messages.
X-Vereinsantrag-Delivery ID to recognize messages you have already handled.200 OK first, then continue in the background.https://.localhost, 127.0.0.1 or addresses from private networks) are rejected for security reasons.https and be publicly reachable – see Target URL requirements. For local testing, use a tunnel service that provides a public https address.X-Vereinsantrag-Event header and in the event field.