/api/v1/ichWer bin ich in diesem Verein, welche Rollen habe ich, und welche Daten darf ich sehen? Immer zuerst aufrufen, wenn unklar ist, was möglich ist.
- Werkzeugname:
- ich
- Benötigt:
- portal.nutzen
Jede Verein.so-Instanz bringt eine HTTP-Schnittstelle mit. Sie spricht dieselbe Fachlogik wie die Oberfläche und hält sich an dieselben Rechte — nicht an eine zweite, laxere Kopie davon.
Basisadresse ist die Adresse des Vereins. Angemeldet wird mit einem persönlichen Zugriffs-Token, das der Nutzer selbst unter Einstellungen → Zugriff für KI & Apps anlegt.
curl -H "Authorization: Bearer vso_…" \
https://euer-verein.verein.so/api/v1/ichDie Antwort sagt, wer man ist, welche Rechte das Token mitbringt und welche Mitglieder man überhaupt sehen darf. Wenn etwas nicht klappt, ist das der erste Aufruf.
403.403, unabhängig von den Rechten des Nutzers.DE21****5228 ). Das gilt auch für Nutzer, die sie in der Oberfläche vollständig sehen dürfen.429 mit Retry-After.Alles ist JSON, UTF-8, ohne Umschlag. Zwei Konventionen weichen von dem ab, was man aus englischsprachigen APIs kennt, und zwar mit Absicht:
"1.234,50"), keine Fließkommazahlen. Beim Schreiben werden "-49,90", "-49.90" und -49.9 alle akzeptiert und in Cent umgerechnet.2026-08-13), damit man damit rechnen kann. Alles andere wird mit einer klaren Meldung abgewiesen.Feldnamen sind deutsch. Das ist keine Nachlässigkeit: Die Fachbegriffe eines deutschen Vereins haben keine sauberen englischen Entsprechungen, und eine halbübersetzte Zuwendungsbestätigung hilft niemandem.
Fehler kommen als { "fehler": "…" } mit einem Text, der sagt, was zu tun ist.
| Code | Bedeutet |
|---|---|
| 400 | Eingabe passt nicht — Pflichtfeld fehlt, Betrag oder Datum unlesbar. Die Meldung nennt das Feld. |
| 401 | Kein, falsches, abgelaufenes oder widerrufenes Token. |
| 403 | Schnittstelle nicht freigeschaltet, fehlendes Recht, oder Nur-Lese-Token bei einem schreibenden Aufruf. |
| 404 | Endpunkt gibt es nicht, Datensatz gibt es nicht — oder er liegt außerhalb der eigenen Datensicht. Diese drei Fälle sind bewusst nicht unterscheidbar. |
| 409 | Vorgang ist bereits abgeschlossen (etwa ein erstatteter Beleg). |
| 429 | Stundenlimit erreicht. |
Der 404 in Zeile vier ist der wichtigste Punkt für Integrationen: Eine Abteilungsleitung, die eine fremde Mitglieds-ID abfragt, bekommt dieselbe Antwort wie bei einer erfundenen ID. Sie soll nicht durch Hochzählen herausfinden können, wer sonst noch im Verein ist.
curl -H "Authorization: Bearer $VSO_TOKEN" \
"https://euer-verein.verein.so/api/v1/beitraege/offen?limit=100"
{
"anzahl": 9,
"summe_offen_gesamt": "412,00",
"posten": [
{
"id": 41,
"mitglied_id": 17,
"mitglied": "Martin Brenner",
"email": "m.brenner@example.org",
"betrag": "64,00",
"zweck": "Jahresbeitrag 2026",
"faellig": "2026-07-01",
"lauf": "Beitragslauf 2. Halbjahr 2026"
}
]
}curl -X POST \
-H "Authorization: Bearer $VSO_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"konto_id": 1,
"datum": "2026-08-13",
"betrag": "-49,90",
"verwendungszweck": "Bälle für die F-Jugend",
"gegenpartei": "Sporthaus Menzel",
"kategorie_id": 7
}' \
https://euer-verein.verein.so/api/v1/buchungen
{
"id": 812,
"ergebnis": "Buchung über -49,90 € auf \"Girokonto\" wurde angelegt (ID 812)."
}Jede schreibende Anfrage landet im Auditlog des Vereins, mit dem Vermerk quelle: api und dem Namen des Tokens. Das ist nicht abschaltbar.
Ein GET auf /api/v1 liefert alle Endpunkte, die das eigene Token benutzen darf, samt Feldern, Typen und Pflichtangaben. Was die Rollen nicht abdecken oder was der Verein abgeschaltet hat, taucht dort gar nicht erst auf.
Die Liste unten stammt aus genau diesem Aufruf gegen eine echte Instanz (Stand 2026-08-13) — sie kann deshalb nicht behaupten, es gäbe etwas, das die Software nicht anbietet.
Davon 8 schreibend. Jeder Eintrag nennt das benötigte Recht und, falls zutreffend, den Funktionsbereich, der eingeschaltet sein muss.
/api/v1/ichWer bin ich in diesem Verein, welche Rollen habe ich, und welche Daten darf ich sehen? Immer zuerst aufrufen, wenn unklar ist, was möglich ist.
/api/v1/abteilungenAlle Abteilungen und ihre Gruppen mit Mitgliederzahl.
/api/v1/mitglieder/:idverändert DatenStammdaten eines Mitglieds ändern. Nur die angegebenen Felder werden überschrieben. Bankverbindung und Status "ausgetreten" laufen bewusst über die Oberfläche.
idganzzahlPflichtaus dem PfadID des Mitglieds.
emailtextNeue E-Mail-Adresse.
telefontextNeue Telefonnummer.
strassetextNeue Straße.
plztextNeue Postleitzahl.
orttextNeuer Ort.
statustextNeuer Status.
Erlaubt: interessentaktiv
mitgliedschaftsart_idganzzahlNeue Mitgliedschaftsart.
notizentextNotiz ersetzen.
/api/v1/mitgliederverändert DatenEin neues Mitglied anlegen. Legt bewusst KEINE Bankverbindung an — SEPA-Mandate werden in der Oberfläche erfasst.
vornametextPflichtVorname.
nachnametextPflichtNachname.
emailtextE-Mail-Adresse.
telefontextTelefonnummer.
geburtsdatumdatumGeburtsdatum (JJJJ-MM-TT).
strassetextStraße und Hausnummer.
plztextPostleitzahl.
orttextOrt.
eintrittdatumEintrittsdatum (JJJJ-MM-TT).
statustextStatus, Standard "interessent".
Erlaubt: interessentaktiv
mitgliedschaftsart_idganzzahlID der Mitgliedschaftsart (siehe mitgliedschaftsarten_liste).
notizentextFreitext-Notiz.
/api/v1/mitglieder/:idEin einzelnes Mitglied mit Abteilungen, Gruppen und offenen Beiträgen.
idganzzahlPflichtaus dem PfadID des Mitglieds.
/api/v1/mitgliederMitglieder suchen und auflisten. Zeigt nur Mitglieder, die ich sehen darf (Trainer und Abteilungsleitung sehen ausschließlich ihre eigenen Gruppen).
suchetextFreitext über Vor-, Nachname, Mitgliedsnummer und E-Mail.
statustextMitgliedsstatus.
Erlaubt: interessentaktivausgetretenabgelehnt
abteilung_idganzzahlNur Mitglieder dieser Abteilung.
gruppe_idganzzahlNur Mitglieder dieser Gruppe.
limitganzzahlWie viele Datensätze höchstens (Standard 50, Maximum 500).
/api/v1/mitgliedschaftsartenDie Mitgliedschaftsarten des Vereins mit Beitragshöhe und Zahlungsintervall.
/api/v1/buchungenverändert DatenEine Buchung erfassen. Negativer Betrag = Ausgabe, positiver = Einnahme.
konto_idganzzahlPflichtID des Kontos (siehe konten_liste).
datumdatumPflichtBuchungsdatum (JJJJ-MM-TT).
betraggeldPflichtBetrag in Euro. Ausgaben negativ, z. B. -49,90.
verwendungszwecktextPflichtWofür.
gegenparteitextWer (Empfänger oder Einzahler).
kategorie_idganzzahlID der Kategorie (siehe kategorien_liste).
projekt_idganzzahlID des Projekts.
notiztextInterne Notiz.
/api/v1/buchungenBuchungen durchsuchen und auswerten — nach Zeitraum, Konto, Kategorie oder Freitext. Liefert zusätzlich die Summe der Treffer.
vondatumAb diesem Datum (JJJJ-MM-TT).
bisdatumBis zu diesem Datum (JJJJ-MM-TT).
konto_idganzzahlNur dieses Konto.
kategorie_idganzzahlNur diese Kategorie.
projekt_idganzzahlNur dieses Projekt.
ohne_kategoriebooleanNur noch nicht kategorisierte Buchungen.
suchetextFreitext über Gegenpartei und Verwendungszweck.
limitganzzahlWie viele Datensätze höchstens (Standard 50, Maximum 500).
/api/v1/buchungen/:idverändert DatenEine vorhandene Buchung kategorisieren oder ergänzen. Betrag, Datum und Konto lassen sich hier bewusst NICHT ändern — das geht nur in der Oberfläche.
idganzzahlPflichtaus dem PfadID der Buchung.
kategorie_idganzzahlNeue Kategorie.
projekt_idganzzahlNeues Projekt.
mitglied_idganzzahlBuchung diesem Mitglied zuordnen.
notiztextNotiz ersetzen.
/api/v1/kategorienBuchungskategorien mit Richtung (Einnahme/Ausgabe) und steuerlicher Zuordnung. Nötig, um Buchungen richtig zu kategorisieren.
/api/v1/kontenAlle Konten des Vereins mit aktuellem Saldo.
jahrganzzahlStichjahr, Standard laufendes Jahr.
/api/v1/projekteProjekte und Kostenstellen mit Budget und bisherigem Verbrauch.
limitganzzahlWie viele Datensätze höchstens (Standard 50, Maximum 500).
/api/v1/beitraege/offenOffene Mitgliedsbeiträge — wer hat noch nicht gezahlt, und wie viel steht insgesamt aus.
limitganzzahlWie viele Datensätze höchstens (Standard 50, Maximum 500).
/api/v1/belege/:id/entscheidungverändert DatenEinen eingereichten Beleg freigeben oder ablehnen. Die eigentliche Auszahlung passiert dadurch nicht — sie läuft weiter über den Erstattungslauf in der Oberfläche.
idganzzahlPflichtaus dem PfadID des Belegs.
entscheidungtextPflichtWas passieren soll.
Erlaubt: freigegebenabgelehnt
kommentartextBegründung — bei Ablehnung dringend empfohlen.
/api/v1/belegeEingereichte Belege und Erstattungsanträge. Ohne Prüfrecht sind nur die eigenen sichtbar.
statustextNur Belege in diesem Status.
Erlaubt: eingereichtin_pruefungfreigegebenabgelehnterstattet
limitganzzahlWie viele Datensätze höchstens (Standard 50, Maximum 500).
/api/v1/spendenErfasste Spenden im Zeitraum, mit Angabe, ob bereits eine Zuwendungsbestätigung erstellt wurde.
jahrganzzahlKalenderjahr, Standard laufendes Jahr.
limitganzzahlWie viele Datensätze höchstens (Standard 50, Maximum 500).
/api/v1/berichte/euerEinnahmen-Überschuss-Rechnung für ein Jahr: alle Einnahmen und Ausgaben nach Kategorie mit Summen.
jahrganzzahlKalenderjahr, Standard laufendes Jahr.
/api/v1/berichte/jahresabrechnungJahresabrechnung nach den vier steuerlichen Bereichen (ideell, Vermögensverwaltung, Zweckbetrieb, wirtschaftlicher Geschäftsbetrieb).
jahrganzzahlKalenderjahr, Standard laufendes Jahr.
/api/v1/sitzungenSitzungen und Protokolle mit Anzahl der Tagesordnungspunkte.
limitganzzahlWie viele Datensätze höchstens (Standard 50, Maximum 500).
/api/v1/termineAnstehende Fristen und Pflichttermine des Vereins (Steuererklärung, Mitgliederversammlung, Vereinsregister).
limitganzzahlWie viele Datensätze höchstens (Standard 50, Maximum 500).
/api/v1/todosverändert DatenEine Aufgabe anlegen.
titeltextPflichtWorum geht es.
beschreibungtextDetails.
faelligdatumFällig bis (JJJJ-MM-TT).
mitglied_idganzzahlWer ist zuständig.
/api/v1/todos/:id/erledigtverändert DatenEine Aufgabe auf erledigt setzen.
idganzzahlPflichtaus dem PfadID der Aufgabe.
/api/v1/todosOffene Aufgaben des Vorstands, zum Beispiel Beschlüsse aus Sitzungen.
statustextStandard "offen".
Erlaubt: offenerledigt
limitganzzahlWie viele Datensätze höchstens (Standard 50, Maximum 500).
/api/v1/veranstaltungenverändert DatenEine Veranstaltung anlegen. Sie startet im Status "geplant" und wird erst nach Freigabe in der Oberfläche für Anmeldungen geöffnet.
titeltextPflichtTitel der Veranstaltung.
vondatumPflichtDatum (JJJJ-MM-TT).
uhrzeittextStartzeit als HH:MM, Standard 00:00.
orttextVeranstaltungsort.
beschreibungtextBeschreibungstext.
gebuehrgeldTeilnahmegebühr in Euro, Standard 0.
max_teilnehmerganzzahlHöchstzahl Teilnehmer.
/api/v1/veranstaltungenVeranstaltungen des Vereins mit Anmeldezahlen.
abdatumNur Veranstaltungen ab diesem Datum. Ohne Angabe: alle kommenden.
limitganzzahlWie viele Datensätze höchstens (Standard 50, Maximum 500).
Dieselben Aktionen gibt es als MCP-Server für Claude und ChatGPT. Es ist derselbe Katalog und dieselbe Rechteprüfung — nur die Verpackung unterscheidet sich.