DokumentationMethacore Apps

Datenquellen

8 min Lesezeit · zuletzt aktualisiert 23. September 2026

Datenquellen sind die Brücke zwischen einer gehosteten App und Methacore. Du nutzt sie in Bindungen, in der Aktion call und in Handlern über data.load(…). Hinter jeder Quelle steht ein Endpunkt der Entwickler-API unter apps.api.methacore.de/v1.

Diese Seite entsteht aus dem SOURCE_CATALOG der Runtime – dieselben Felder und Beispieldaten, die der Builder auf seiner Fläche zeigt.

Übersicht

QuelleIm BuilderScopeArtpickState-Schlüssel
me.profileMein Profilmc.me.profile:readObjektprofil
me.groupsMeine Gruppenmc.me.groups:readListeitemsgruppen
me.eventsMeine Terminemc.me.events:readListeitemstermine
me.trainingplansMeine Trainingsplänemc.me.trainingplans:readListeitemstrainingsplaene
me.competitionsMeine Turnierergebnissemc.me.competitions:readListeitemsturniere
me.membercardMein Mitgliedsausweismc.me.membercard:readObjektcardausweis
storage.listApp-Speicher (Liste)mc.apps.storage:readListeitemseintraege
storage.getApp-Speicher (Eintrag)mc.apps.storage:readObjekteintrag
storage.putApp-Speicher: Eintrag speichernmc.apps.storage:writegespeichert
storage.deleteApp-Speicher: Eintrag löschenmc.apps.storage:writegeloescht
requestAndere Methacore-APIje nach APIantwort

Art sagt, was die Quelle liefert: ein einzelnes Objekt oder eine Liste von Zeilen. Bei Listen steht unter pick der Pfad, an dem die Zeilen liegen – der Builder trägt ihn beim Hinzufügen selbst ein, sodass im State direkt die Liste landet.

Zeitpunkte: start und end der Termine, timestamp der Ergebnisse und updatedAt im Speicher liefert die API als Unix-Zeitstempel in Sekunden. Die Beispieldaten des Builders zeigen sie zur besseren Lesbarkeit als ISO-Text. me.events liefert über die Datenquelle immer die nächsten 90 Tage; einen anderen Zeitraum fragst du über die API ab.

Alle Daten gehören dem Mitglied

Die me.*-Quellen liefern ausschließlich Daten des angemeldeten Mitglieds im Verein, für den es der App zugestimmt hat. Eine App sieht niemanden außer dem, der sie gerade benutzt. Für Vereinsdaten (Mitgliederliste, Buchhaltung, …) gibt es die Quelle request – mit den Scopes der jeweiligen Methacore-API.

Fehlt ein Scope

Antwortet eine Quelle mit 403 und der Meldung This token does not carry the <scope> scope., fragt die Runtime den Host einmal nach einem Token mit diesem Scope. Der Host zeigt dem Mitglied „Zugriff erweitern“ mit der fehlenden Berechtigung. Stimmt es zu, wiederholt die Runtime den Aufruf einmal; sonst schlägt die Aktion fehl. Trag deshalb alle Scopes, die deine App braucht, gleich in auth.scopes ein – dann fragt sie beim ersten Öffnen einmal und nie wieder.

Quellen im Einzelnen

me.profile – Mein Profil

Scope mc.me.profile:read · Endpunkt GET /me/profile.

Keine Parameter.

Felder:

FeldIm BuilderTypBedeutung
idIDidKennung des Mitglieds
firstNameVornametextVorname des angemeldeten Mitglieds
lastNameNachnametextNachname des angemeldeten Mitglieds
emailE-MailemailE-Mail-Adresse des Kontos
birthdayGeburtstagdateGeburtsdatum, falls hinterlegt
imageProfilbildurlAdresse des Profilbilds, leer ohne Bild
{
  "id": "665f1c2a9b1e4a0012ab34cd",
  "firstName": "Anna",
  "lastName": "Schneider",
  "email": "[email protected]",
  "birthday": "1988-04-12",
  "image": "https://images.methacore.de/beispiel/anna.jpg"
}

me.groups – Meine Gruppen

Scope mc.me.groups:read · Endpunkt GET /me/groups.

Keine Parameter.

Felder (je Zeile unter items):

FeldIm BuilderTypBedeutung
idIDidKennung der Gruppe
nameNametextName der Gruppe
roleRolletext„member“ als Mitglied, „trainer“ als Trainer der Gruppe
{
  "items": [
    {
      "id": "g1",
      "name": "Voltigieren Kinder",
      "role": "member"
    },
    {
      "id": "g2",
      "name": "Dressur Fortgeschrittene",
      "role": "trainer"
    },
    {
      "id": "g3",
      "name": "Vorstand",
      "role": "member"
    }
  ]
}

me.events – Meine Termine

Scope mc.me.events:read · Endpunkt GET /me/events.

Keine Parameter.

Felder (je Zeile unter items):

FeldIm BuilderTypBedeutung
idIDidKennung des Termins
titleTiteltextBezeichnung des Termins
startBeginndatetimeBeginn als Zeitpunkt
endEndedatetimeEnde als Zeitpunkt
locationOrttextOrt des Termins, leer ohne Angabe
{
  "items": [
    {
      "id": "e1",
      "title": "Training Voltigieren",
      "start": "2026-10-02T17:00:00+02:00",
      "end": "2026-10-02T18:30:00+02:00",
      "location": "Reithalle"
    },
    {
      "id": "e2",
      "title": "Mitgliederversammlung",
      "start": "2026-10-15T19:00:00+02:00",
      "end": "2026-10-15T21:00:00+02:00",
      "location": "Vereinsheim"
    },
    {
      "id": "e3",
      "title": "Herbstturnier",
      "start": "2026-10-24T09:00:00+02:00",
      "end": "2026-10-24T17:00:00+02:00",
      "location": "Außenplatz"
    }
  ]
}

me.trainingplans – Meine Trainingspläne

Scope mc.me.trainingplans:read · Endpunkt GET /me/trainingplans.

Keine Parameter.

Felder (je Zeile unter items):

FeldIm BuilderTypBedeutung
idIDidKennung des Trainingsplans
nameNametextName des Trainingsplans
categoryKategorietextKategorie des Plans, falls vergeben
descriptionBeschreibungtextBeschreibung des Plans
exerciseCountAnzahl ÜbungennumberWie viele Übungen der Plan enthält
groupGruppetextGruppe, der der Plan zugeordnet ist
{
  "items": [
    {
      "id": "t1",
      "name": "Grundlagen Pflicht",
      "category": "Voltigieren",
      "description": "Pflichtübungen für Einsteiger",
      "exerciseCount": 7,
      "group": "Voltigieren Kinder"
    },
    {
      "id": "t2",
      "name": "Ausdauer Herbst",
      "category": "Kondition",
      "description": "Laufen und Kraft im Wechsel",
      "exerciseCount": 5,
      "group": "Dressur Fortgeschrittene"
    }
  ]
}

me.competitions – Meine Turnierergebnisse

Scope mc.me.competitions:read · Endpunkt GET /me/competitions.

Keine Parameter.

Felder (je Zeile unter items):

FeldIm BuilderTypBedeutung
idIDidKennung des Ergebnisses
competitionIdTurnier-IDidKennung des Turniers
competitionTurniertextName des Turniers
disciplineIdDisziplin-IDidKennung der Disziplin
placePlatznumberErreichte Platzierung
scoreWertungnumberErreichte Punktzahl
timestampZeitpunktdatetimeWann das Ergebnis eingetragen wurde
{
  "items": [
    {
      "id": "r1",
      "competitionId": "c1",
      "competition": "Frühjahrsturnier Weeze",
      "disciplineId": "d1",
      "place": 2,
      "score": 7.4,
      "timestamp": "2026-04-18T14:20:00+02:00"
    },
    {
      "id": "r2",
      "competitionId": "c2",
      "competition": "Kreismeisterschaft",
      "disciplineId": "d4",
      "place": 1,
      "score": 8.1,
      "timestamp": "2026-06-07T11:05:00+02:00"
    }
  ]
}

me.membercard – Mein Mitgliedsausweis

Scope mc.me.membercard:read · Endpunkt GET /me/membercard.

Keine Parameter.

Felder (je Zeile unter card):

FeldIm BuilderTypBedeutung
serialSeriennummertextNummer des Ausweises
statusStatustextZustand des Ausweises, z. B. „valid“
validGültigbooleanOb der Ausweis gerade gültig ist
nameNametextName auf dem Ausweis
memberNumberMitgliedsnummertextMitgliedsnummer im Verein
departmentsAbteilungenlistAbteilungen, die auf dem Ausweis stehen
validUntilGültig bisdateAblaufdatum des Ausweises
{
  "card": {
    "serial": "MC-2026-0042",
    "status": "valid",
    "valid": true,
    "name": "Anna Schneider",
    "memberNumber": "1042",
    "departments": [
      "Voltigieren",
      "Dressur"
    ],
    "validUntil": "2026-12-31"
  }
}

storage.list – App-Speicher (Liste)

Scope mc.apps.storage:read · Endpunkt GET /storage/{collection}.

ParameterPflichtBedeutung
collectionjaName der Sammlung, 1–64 Zeichen A–Z a–z 0–9 _ -
scopeneinorg (geteilt im Verein, Standard) oder user (nur das Mitglied)
limitneinEinträge je Seite, 1–200, Standard 50
offsetneinWie viele Einträge übersprungen werden, Standard 0

Felder (je Zeile unter items):

FeldIm BuilderTypBedeutung
keySchlüsseltextSchlüssel des Eintrags
valueWerttextGespeicherter Wert, Text oder JSON
updatedAtGeändert amdatetimeZeitpunkt der letzten Änderung
{
  "items": [
    {
      "key": "notiz-1",
      "value": "Sattel zur Reparatur bringen",
      "updatedAt": "2026-09-20T10:15:00+02:00"
    },
    {
      "key": "notiz-2",
      "value": "Hallenplan für Oktober aushängen",
      "updatedAt": "2026-09-22T08:40:00+02:00"
    }
  ],
  "total": 2
}

storage.get – App-Speicher (Eintrag)

Scope mc.apps.storage:read · Endpunkt GET /storage/{collection}/{key}.

ParameterPflichtBedeutung
collectionjaName der Sammlung, 1–64 Zeichen A–Z a–z 0–9 _ -
keyjaSchlüssel des Eintrags, gleiche Regeln wie die Sammlung
scopeneinorg (geteilt im Verein, Standard) oder user (nur das Mitglied)

Felder:

FeldIm BuilderTypBedeutung
keySchlüsseltextSchlüssel des Eintrags
valueWerttextGespeicherter Wert, Text oder JSON
updatedAtGeändert amdatetimeZeitpunkt der letzten Änderung
{
  "key": "notiz-1",
  "value": "Sattel zur Reparatur bringen",
  "updatedAt": "2026-09-20T10:15:00+02:00"
}

storage.put – App-Speicher: Eintrag speichern

Scope mc.apps.storage:write · Endpunkt PUT /storage/{collection}/{key}.

ParameterPflichtBedeutung
collectionjaName der Sammlung, 1–64 Zeichen A–Z a–z 0–9 _ -
keyjaSchlüssel des Eintrags, gleiche Regeln wie die Sammlung
valuejaZu speichernder Wert, beliebiges JSON
scopeneinorg (geteilt im Verein, Standard) oder user (nur das Mitglied)

Antwort: der gespeicherte Eintrag { key, value, updatedAt }.

storage.delete – App-Speicher: Eintrag löschen

Scope mc.apps.storage:write · Endpunkt DELETE /storage/{collection}/{key}.

ParameterPflichtBedeutung
collectionjaName der Sammlung, 1–64 Zeichen A–Z a–z 0–9 _ -
keyjaSchlüssel des Eintrags, gleiche Regeln wie die Sammlung
scopeneinorg (geteilt im Verein, Standard) oder user (nur das Mitglied)

Antwort: nichts. Unbekannte Schlüssel schlagen mit 404 fehl.

request – andere Methacore-APIs

request ruft einen beliebigen Endpunkt einer Methacore-API im Namen des Mitglieds auf. Damit kommen Apps für den Vorstand an Vereinsdaten:

{ "source": "request", "to": "mitglieder", "pick": "data",
  "params": { "section": "members", "path": "/members", "query": { "limit": 200 } } }

Voraussetzungen:

  • Die API ist im DevHub-Projekt freigeschaltet und der OAuth-Client trägt ihren Scope, z. B. mc.members:read.
  • Der Scope steht in auth.scopes von app.json.
  • Das Mitglied hat im Verein selbst die Rechte, die die API verlangt. Ein Token kann nie mehr als sein Inhaber.

Welche Sektionen, Pfade und Scopes es gibt, steht in der Referenz unter Methacore. Die Sicherheitsrichtlinie der App erlaubt Verbindungen nur zu *.api.methacore.de und zum DevHub – andere Adressen erreicht eine gehostete App nicht.

Beispieldaten im Builder

Solange du im Builder arbeitest, zeigt die Fläche die Beispielantworten oben statt echter Daten. Im Datenexplorer klickst du Felder an, statt {{…}} zu tippen: ein Klick auf title in Meine Termine setzt {{item.title}} bzw. die passende Spalte. Echte Daten gibt es erst in der Vorschau und in der veröffentlichten App.