Datenquellen
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
| Quelle | Im Builder | Scope | Art | pick | State-Schlüssel |
|---|---|---|---|---|---|
me.profile | Mein Profil | mc.me.profile:read | Objekt | – | profil |
me.groups | Meine Gruppen | mc.me.groups:read | Liste | items | gruppen |
me.events | Meine Termine | mc.me.events:read | Liste | items | termine |
me.trainingplans | Meine Trainingspläne | mc.me.trainingplans:read | Liste | items | trainingsplaene |
me.competitions | Meine Turnierergebnisse | mc.me.competitions:read | Liste | items | turniere |
me.membercard | Mein Mitgliedsausweis | mc.me.membercard:read | Objekt | card | ausweis |
storage.list | App-Speicher (Liste) | mc.apps.storage:read | Liste | items | eintraege |
storage.get | App-Speicher (Eintrag) | mc.apps.storage:read | Objekt | – | eintrag |
storage.put | App-Speicher: Eintrag speichern | mc.apps.storage:write | – | – | gespeichert |
storage.delete | App-Speicher: Eintrag löschen | mc.apps.storage:write | – | – | geloescht |
request | Andere Methacore-API | je nach API | – | – | antwort |
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:
| Feld | Im Builder | Typ | Bedeutung |
|---|---|---|---|
id | ID | id | Kennung des Mitglieds |
firstName | Vorname | text | Vorname des angemeldeten Mitglieds |
lastName | Nachname | text | Nachname des angemeldeten Mitglieds |
email | E-Mail-Adresse des Kontos | ||
birthday | Geburtstag | date | Geburtsdatum, falls hinterlegt |
image | Profilbild | url | Adresse 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):
| Feld | Im Builder | Typ | Bedeutung |
|---|---|---|---|
id | ID | id | Kennung der Gruppe |
name | Name | text | Name der Gruppe |
role | Rolle | text | „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):
| Feld | Im Builder | Typ | Bedeutung |
|---|---|---|---|
id | ID | id | Kennung des Termins |
title | Titel | text | Bezeichnung des Termins |
start | Beginn | datetime | Beginn als Zeitpunkt |
end | Ende | datetime | Ende als Zeitpunkt |
location | Ort | text | Ort 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):
| Feld | Im Builder | Typ | Bedeutung |
|---|---|---|---|
id | ID | id | Kennung des Trainingsplans |
name | Name | text | Name des Trainingsplans |
category | Kategorie | text | Kategorie des Plans, falls vergeben |
description | Beschreibung | text | Beschreibung des Plans |
exerciseCount | Anzahl Übungen | number | Wie viele Übungen der Plan enthält |
group | Gruppe | text | Gruppe, 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):
| Feld | Im Builder | Typ | Bedeutung |
|---|---|---|---|
id | ID | id | Kennung des Ergebnisses |
competitionId | Turnier-ID | id | Kennung des Turniers |
competition | Turnier | text | Name des Turniers |
disciplineId | Disziplin-ID | id | Kennung der Disziplin |
place | Platz | number | Erreichte Platzierung |
score | Wertung | number | Erreichte Punktzahl |
timestamp | Zeitpunkt | datetime | Wann 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):
| Feld | Im Builder | Typ | Bedeutung |
|---|---|---|---|
serial | Seriennummer | text | Nummer des Ausweises |
status | Status | text | Zustand des Ausweises, z. B. „valid“ |
valid | Gültig | boolean | Ob der Ausweis gerade gültig ist |
name | Name | text | Name auf dem Ausweis |
memberNumber | Mitgliedsnummer | text | Mitgliedsnummer im Verein |
departments | Abteilungen | list | Abteilungen, die auf dem Ausweis stehen |
validUntil | Gültig bis | date | Ablaufdatum 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}.
| Parameter | Pflicht | Bedeutung |
|---|---|---|
collection | ja | Name der Sammlung, 1–64 Zeichen A–Z a–z 0–9 _ - |
scope | nein | org (geteilt im Verein, Standard) oder user (nur das Mitglied) |
limit | nein | Einträge je Seite, 1–200, Standard 50 |
offset | nein | Wie viele Einträge übersprungen werden, Standard 0 |
Felder (je Zeile unter items):
| Feld | Im Builder | Typ | Bedeutung |
|---|---|---|---|
key | Schlüssel | text | Schlüssel des Eintrags |
value | Wert | text | Gespeicherter Wert, Text oder JSON |
updatedAt | Geändert am | datetime | Zeitpunkt 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}.
| Parameter | Pflicht | Bedeutung |
|---|---|---|
collection | ja | Name der Sammlung, 1–64 Zeichen A–Z a–z 0–9 _ - |
key | ja | Schlüssel des Eintrags, gleiche Regeln wie die Sammlung |
scope | nein | org (geteilt im Verein, Standard) oder user (nur das Mitglied) |
Felder:
| Feld | Im Builder | Typ | Bedeutung |
|---|---|---|---|
key | Schlüssel | text | Schlüssel des Eintrags |
value | Wert | text | Gespeicherter Wert, Text oder JSON |
updatedAt | Geändert am | datetime | Zeitpunkt 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}.
| Parameter | Pflicht | Bedeutung |
|---|---|---|
collection | ja | Name der Sammlung, 1–64 Zeichen A–Z a–z 0–9 _ - |
key | ja | Schlüssel des Eintrags, gleiche Regeln wie die Sammlung |
value | ja | Zu speichernder Wert, beliebiges JSON |
scope | nein | org (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}.
| Parameter | Pflicht | Bedeutung |
|---|---|---|
collection | ja | Name der Sammlung, 1–64 Zeichen A–Z a–z 0–9 _ - |
key | ja | Schlüssel des Eintrags, gleiche Regeln wie die Sammlung |
scope | nein | org (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.scopesvonapp.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.