Vereinsantrag
HandbuchDeveloper
Vereinsantrag.online
HandbuchDeveloper
Vereinsantrag.online
  1. Managing your club
  • Welcome to the developer portal
  • Get your token
  • Rate-Limiting
  • API-Reference
    • Authentication
      • AuthenticationService
        • /auth/login
        • /auth/refresh
        • /auth/manage/info
        • /auth/manage/info
      • Users
        • Get all users for the current club (Admin only)
        • Create a new user in the current club without password - user receives email invitation (Admin only)
        • Get user by ID within the current club
        • Update user details within the current club
        • Delete a user from the current club (Admin only)
        • Resend password setup email to a user (Admin only)
        • Get available roles (Admin only)
    • Managing your club
      • Club
        • Gets the information of the club.
        • Changes the information of the club.
        • Gets the logo of the club.
        • Changes the logo of the club.
      • Department
        • Retrieves all departments for the current club.
        • Creates a new department.
        • Retrieves a specific department by its ID.
        • Deletes a specific department by its ID.
        • Modifies an existing department.
        • Retrieves the settings for the departments.
        • Updates the settings for the departments.
      • Forms
        • Get Membership Form
        • Modify Membership Form
        • Get Cancellation Form
        • Modify Cancellation Form
        • Get Form Design
        • Updates form Design
      • Membership
        • Retrieves all memberships for the current club.
        • Creates a new membership.
        • Retrieves a specific membership by its ID.
        • Deletes a specific membership by its ID.
        • Modifies an existing membership.
      • CustomField
        • Retrieves all custom fields for the current club.
        • Creates a new custom field.
        • Retrieves a specific custom field by its internal name.
        • Deletes a specific custom field by its internal name.
        • Partially modifies an existing custom field.
      • DataPrivacy
        • Retrieves the data privacy settings for the club.
        • Updates the data privacy settings for the club.
      • Settings
        • Get email template
        • Set email template
        • Reset email template
        • Get system email template
        • Get SMTP settings
        • Set SMTP settings
        • Test SMTP connection
        • Get available placeholders for email template
        • Get notification settings (who receives emails on new submissions)
        • Save notification settings
      • Webhooks
        • List webhooks
        • Create webhook
        • Update webhook
        • Delete webhook
        • Rotate secret
        • Test webhook
        • Delivery history
    • Submits
      • Cancellations
        • Get cancellation by id
        • Delete cancellation
        • Update cancellation submission
        • Create new cancellation
        • Get cancellation PDF
        • Get cancellation CSV
        • Export cancellation as text
        • Confirm cancellation
        • Resends the confirmation email for a cancellation application
        • Retrieves the history for a specific cancellation submission.
      • Changes
        • Create a new change request
        • Get change request by ID
        • Delete change request
        • Update change submission
        • Get change request PDF
        • Get change request CSV
        • Export change request as text
        • Confirm change request
        • Resends the confirmation email for a change membership application
        • Retrieves the history for a specific change submission.
      • Memberships
        • Creates a new membership application
        • Retrieves a membership application
        • Deletes a membership application
        • Update membership application
        • Exports a membership application as PDF
        • Exports a membership application as CSV
        • Exports a membership application as text
        • Exports a membership application as verein.cloud® CSV
        • Confirms a membership application
        • Resends the confirmation email for a membership application
        • Retrieves the history for a specific membership submission.
      • Submits
        • Retrieves all submissions.
        • Accepts a submission.
        • Denies a submission.
        • Starts a PDF export job
        • Downloads exported files as ZIP
        • Returns export job progress
        • Starts a CSV export job
        • Starts a verein.cloud® export job
    • Reporting
      • Dashboard
        • Gets the count of new memberships.
        • Gets the count of new changes.
        • Gets the count of new cancellations.
        • Gets the membership chart data.
        • Gets all dashboard KPI values in a single call.
        • Gets the submission trend (memberships, changes, cancellations and net development) per week or month.
        • Gets the age distribution of new members (including family members) in the period.
        • Gets the gender distribution of new members (including family members) in the period.
        • Gets the most popular departments by new memberships in the period.
        • Gets the distribution of membership types in the period.
        • Gets the payment method distribution of new memberships in the period.
        • Gets the application funnel (received, e-mail confirmed, accepted, rejected) for the period.
        • Gets the average processing time per month for the period.
        • Gets the most common zip codes of new members in the period.
        • Gets the webhook delivery trend (succeeded vs. failed) per month for the period.
  1. Managing your club

Webhooks

With webhooks, Vereinsantrag notifies your own systems automatically and in real time whenever certain events happen in your club – for example when a new application arrives or is accepted. This lets you forward applications to a CRM, an accounting system or an automation tool without any manual steps.
Technically, Vereinsantrag sends an HTTP 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.

Contents#

Setting up a webhook
Available events
Managing webhooks
Message structure
Security: verifying the signature
Delivery and retries
Target URL requirements
FAQ

Setting up a webhook#

1.
Open the club settings and switch to the Webhooks tab.
2.
Click New webhook ("Neuer Webhook").
3.
Fill in the fields:
Name – a free-text name for recognition, e.g. "CRM integration".
Target URL ("Ziel-URL") – the https address the data is sent to.
Events – select one or more events you want to be notified about.
Active ("Aktiv") – only active webhooks receive messages.
4.
After saving, the secret is shown once.
⚠️ 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.

Available events#

Shown in the appValue in the messageTriggered when …
"Antrag eingegangen"ApplicationReceiveda new application (membership, change or cancellation) is received
"E-Mail (DOI) bestätigt"EmailConfirmedthe applicant has confirmed their e-mail address
"Antrag akzeptiert"ApplicationAcceptedan application was accepted
"Antrag abgelehnt"ApplicationRejectedan application was rejected
A webhook only receives the events you have assigned to it.

Managing webhooks#

In the overview, each webhook has a menu (⋮) with the following actions:
History ("Verlauf") – shows the most recent deliveries with status, HTTP response code, duration and any error message.
Test ("Testen") – sends a sample message to the target URL to check the connection.
Rotate secret ("Secret neu erzeugen") – creates a new secret. The previous one becomes invalid immediately, so your integration must be switched to the new secret afterwards.
Edit ("Bearbeiten") – change name, URL, events and the active state. The secret stays unchanged.
Delete ("Löschen") – removes the webhook together with its delivery history.
💡 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.

Message structure#

Every message is a POST request with a JSON body and several headers.

Headers#

HeaderMeaning
X-Vereinsantrag-EventThe event type, e.g. ApplicationReceived.
X-Vereinsantrag-DeliveryUnique ID of this delivery – ideal for detecting retries.
X-Vereinsantrag-TimestampTime the signature was created, as a Unix timestamp (seconds).
X-Vereinsantrag-SignatureSignature of the message in the form sha256=<hex> (see below).

Body (example)#

{
  "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
  }
}
Fields in the 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.

Security: verifying the signature#

Every message is signed with your secret using HMAC-SHA256. This lets you confirm that the message really comes from Vereinsantrag and was not altered in transit. Verify the signature before processing the data.
This is how the signature is built (and how you verify it):
1.
Read the X-Vereinsantrag-Timestamp header (timestamp) and X-Vereinsantrag-Signature.
2.
Build the string "<timestamp>.<raw-body>" – i.e. the timestamp, a dot, then the unmodified JSON body you received.
3.
Compute its HMAC-SHA256 using your secret as the key and prepend sha256=.
4.
Compare the result with the value from 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.

Example (Node.js / Express)#

Optional but recommended: reject messages whose X-Vereinsantrag-Timestamp is too far in the past (e.g. older than 5 minutes) to prevent replaying old messages.

Delivery and retries#

Your endpoint should respond quickly with a status code in the 2xx range. Only then is the delivery considered successful.
If the endpoint does not respond with 2xx, is unreachable or too slow, Vereinsantrag retries the delivery up to three times. After that it is marked as failed.
Because of these retries, the same message may arrive more than once. Make your processing idempotent and use the X-Vereinsantrag-Delivery ID to recognize messages you have already handled.
Handle expensive work asynchronously where possible: respond with 200 OK first, then continue in the background.
You can review the outcome of every delivery at any time under History ("Verlauf").

Target URL requirements#

Must start with https://.
Must be publicly reachable from the internet. Internal or local addresses (e.g. localhost, 127.0.0.1 or addresses from private networks) are rejected for security reasons.
Should only accept requests with a valid signature.

FAQ#

I can't edit the Webhooks tab / the controls are greyed out.
Webhooks are available from the Gold tier.
Saving shows "The URL points to a disallowed (internal) address" or similar.
The target URL must use https and be publicly reachable – see Target URL requirements. For local testing, use a tunnel service that provides a public https address.
I lost my secret.
Use Rotate secret ("Secret neu erzeugen") to create a new one and store it in your integration. The old secret becomes invalid immediately.
A delivery shows "Failed" in the history.
Check the HTTP response code or error message shown there. Common causes: your endpoint does not respond with 2xx, is unreachable, or responds too slowly. Use Test ("Testen") to check the connection directly.
Can the same webhook receive multiple events?
Yes. Just select several events when creating or editing it. Which event triggered a given message is shown in the X-Vereinsantrag-Event header and in the event field.
Previous
Save notification settings
Next
List webhooks
Built with