Die GraphQL-API des Modells
Die Tabellen-APIs und das aus dem Datenmodell generierte GraphQL-Schema — CRUD-Operationen, Filter, Sortierung, Paginierung, Summen und Enums.
Jede App von Keplin liefert eine GraphQL-API an einem eigenen Endpunkt aus. Das Schema dieser API wird nicht von Hand geschrieben: Es wird aus zwei Quellen generiert — den APIs, die Sie im Konstruktor bauen, und dem Datenmodell der App. Die Tabellen des Modells werden zu GraphQL-Typen mit ihren Feldern und Relationen; die Enums des Modells werden zu GraphQL-Enums; und eine Tabellen-API verwandelt eine Tabelle in vollständige Lese- und Schreiboperationen, mit Filtern, Sortierung und Paginierung, ohne dass Sie eine Zeile SQL schreiben.
Diese Seite behandelt den Endpunkt, die Tabellen-APIs und die Abfragesprache, die sie den Clients bieten.
Der Endpunkt der App
Alle Operationen einer App werden an einem einzigen GraphQL-Endpunkt ausgeliefert:
POST /api/graphql/<endereco-da-app>
In der Beispiel-App: POST /api/graphql/gestao-clientes. Der Request ist
ein JSON mit query und variables, wie bei jedem GraphQL-Dienst — der Tab
Docs jeder API gibt Ihnen fertige Beispiele zum Kopieren. Wenn die App
unter einer eigenen Adresse veröffentlicht ist, antwortet derselbe Dienst
auch unter /api/graphql dieser Adresse.
Wer den Endpunkt aufrufen kann:
| Wer aufruft | Wie er sich authentifiziert | Was er sieht |
|---|---|---|
| Die Bildschirme der App | Sitzung des App-Benutzers (automatisch) | Veröffentlichte APIs |
| Externe Systeme | Header x-api-key — siehe API-Schlüssel |
Veröffentlichte APIs innerhalb des Scopes des Schlüssels |
| Wer baut | Sitzung auf der Plattform | Veröffentlichte APIs UND Entwürfe (als Entwurf markiert) |
| Anonyme | Nichts | Nur öffentliche APIs |
Nota
Die Versionen der App zählen auch: Ein API-Schlüssel und die anonymen Requests sprechen immer mit der Hauptversion (oder mit der veröffentlichten Version der verwendeten Adresse); wer baut, sieht SEINE Arbeitsversion. Ein Schlüssel erwischt niemals zufällig das, was ein Developer gerade halb umgebaut hat.
Eine Tabellen-API erstellen
- Erstellen Sie eine API (Neue API) mit
dem Namen, der als Basis der Operationen dienen wird — zum Beispiel
contas. - Klicken Sie im Tab Aufbau, Abschnitt Pipeline, auf den Button Tabelle. Der Tabellen-Block belegt die ganze Pipeline — er lässt sich nicht mit Schritten SQL, HTTP oder Skript kombinieren.
- Wählen Sie die Tabelle im Selektor Tabelle wählen… — die Tabellen erscheinen nach Datenquelle gruppiert, mit Suche nach Tabellen- oder Datenquellennamen.
- Aktivieren Sie die Bereitgestellte Aktionen und passen Sie die Enthaltene Felder an (siehe unten).
- Speichern. Zum Veröffentlichen braucht es eine gewählte Tabelle und mindestens eine aktive Aktion.


Nota
Der Selektor zeigt nur Tabellen, die ins Datenmodell importiert wurden. Ist er leer, importieren Sie zuerst Tabellen im Tab Modell einer Datenquelle.
Bereitgestellte Aktionen
Jede aktive Aktion erzeugt eine Operation im Schema, mit dem von der Basis
abgeleiteten Namen — für die API contas:
| Aktion | Erzeugte Operation | Was sie tut |
|---|---|---|
| Select | getContas (Query) |
Liste mit Filtern/Sortierung/Paginierung. Bringt countContas mit, die Gesamtzahl. |
| Insert | addContas (Mutation) |
Erstellt eine Zeile. |
| Update | updateContas (Mutation) |
Aktualisiert eine Zeile über den Primärschlüssel — partiell: ändert nur, was Sie senden. |
| Delete | deleteContas (Mutation) |
Löscht eine Zeile über den Primärschlüssel und gibt true zurück. |
Die Zeile Öffentlicher Zugriff (ohne Sitzung) steuert, Aktion für Aktion, was die öffentlichen Bildschirme aufrufen dürfen — Details unter Öffentliche APIs.
Enthaltene Felder
Der Baum Enthaltene Felder definiert die Form der Antwort: Wählen Sie
die Felder ab, die Sie nicht exponieren wollen, und klappen Sie die
Navigationsfelder aus, um verwandte Entitäten einzuschließen — rekursiv,
wie in einem visuellen GraphQL-Editor. Bei einer API contas führt das
Ausklappen des Navigators contactos dazu, dass die Clients die Kontakte
jedes Kontos im selben Aufruf anfordern können.

Atenção
Mit aktivem Insert oder Update bleiben die Pflichtfelder der Tabelle (nicht-null, ohne automatischen Wert) immer enthalten — ohne sie ließen sich keine gültigen Zeilen erstellen. Der Konstruktor zeigt sie markiert und gesperrt.
Daten lesen: Filter, Sortierung, Paginierung
Die Listen-Query akzeptiert vier Argumente: where, order, take und
skip. Ein vollständiges Beispiel in der App Kundenverwaltung:
query {
getContas(
where: { cidade: { eq: "Lisboa" }, estado: { neq: "ARQUIVADA" } }
order: [{ nome: ASC }]
take: 20
skip: 0
) {
id
nome
cidade
contactos {
nome
email
}
}
}
Das Argument where
Jedes filterbare Feld akzeptiert Operatoren je nach Typ:
| Typ des Feldes | Operatoren |
|---|---|
| Text (und Enums) | eq, neq, contains, startsWith, endsWith, gt, gte, lt, lte, in, nin |
Zahlen (Int, Float) |
eq, neq, gt, gte, lt, lte, in, nin |
Boolean |
eq, neq |
ID |
eq, neq, in, nin |
Und zwei Kombinatoren für zusammengesetzte Bedingungen: and und or, die
Listen von Filtern erhalten.
where: {
or: [
{ cidade: { eq: "Lisboa" } }
{ cidade: { eq: "Porto" } }
]
valorAnual: { gte: 10000 }
}
Nützliche Regeln:
eq: nullfindet die Datensätze mit leerem Feld;neq: nulldie ausgefüllten.- Datumsintervalle: Als ISO-Text gespeicherte Daten (z. B.
2026-08-11) sortieren alphabetisch so, wie sie zeitlich sortieren, weshalbgt/lt/gte/lteauf Text genügen, um Intervalle zu filtern —dataCriacao: { gte: "2026-01-01", lt: "2026-07-01" }. inerhält eine Liste von Werten;ninschließt sie aus.- Die Werte des Filters gehen immer parametrisiert zur Datenbank — ein
containsmit bösartigem Text ist kein Risiko.
Sortieren und paginieren
orderist eine Liste von{ feld: ASC }oder{ feld: DESC }— mehrere Einträge sortieren nach mehreren Feldern, in der angegebenen Reihenfolge.takebegrenzt die Zahl der Zeilen (Obergrenze 10 000 pro Request) undskipüberspringt die ersten N — zusammen ergeben sie die klassische Paginierung.
Die Gesamtzahl: count
Jede Tabellen-API mit aktivem Select erhält auch count<Name>, das die
Gesamtzahl der Zeilen des SELBEN where zurückgibt. Das natürliche Paar
einer paginierten Tabelle ist, die Seite und die Gesamtzahl in einer
einzigen Operation anzufordern, mit Aliassen:
query {
items: getContas(take: 10, skip: 0) { id nome }
total: countContas
}
Mit Filter übergeben Sie beiden Feldern dasselbe where — die Gesamtzahl
zählt genau die Zeilen, die die Liste ohne Paginierung zurückgeben würde.
Daten schreiben
addContaserhält die enthaltenen Felder als Argumente (die Pflichtfelder der Tabelle sind in der Mutation Pflicht). Bei manchen Datenbanken ist die Antwort die erstellte Zeile; bei anderentrue— der Tab Docs der API zeigt die genaue Form in Ihrem Fall.updateContaserhält den Primärschlüssel (Pflicht) und die übrigen Felder als optional — es aktualisiert nur, was Sie senden — und gibt die aktualisierte Zeile zurück.deleteContaserhält den Primärschlüssel und gibttruezurück.
mutation ($nome: String!, $cidade: String) {
addContas(nome: $nome, cidade: $cidade) {
id
nome
}
}
Nota
Die Berechtigungen der App gelten hier, immer: Wenn der Benutzer der App
nur die Konten seines Teams sehen darf, geben getContas und
countContas nur diese zurück — und zählen nur diese —, egal wer aufruft
(Bildschirm, Bericht oder Workflow).
Enums
Ein Enum exponiert eine feste Menge von Werten im GraphQL-Schema — den Status eines Kontos, die Phase einer Verkaufschance. Verwaltet werden sie auf der Seite APIs, Tab Enums:
- Klicken Sie auf Neues Enum.
- Geben Sie einen Namen (z. B.
EstadoConta) und, wenn es hilft, eine Beschreibung. - Fügen Sie Werte mit Wert hinzufügen hinzu — jeder Wert hat einen Bezeichner (value), ein optionales Label und eine optionale Farbe. Farbe und Label werden von den Bildschirmen verwendet; der value ist das, was in der API reist.
- Speichern.


Ein Enum wird an zwei Stellen verwendet: als Typ eines Feldes des Modells (das Feld akzeptiert dann nur noch diese Werte, und in den Filtern verhält es sich wie Text) und als Argumenttyp einer API. Im Schema sehen die Clients das Enum mit seinen Werten — die Vervollständigung der Testumgebung schlägt sie vor.
Atenção
Ein Enum zu löschen ist endgültig, und die Felder/Argumente, die es verwendet haben, referenzieren es nicht mehr. Ziehen Sie es vor, die Werte zu bearbeiten, statt das Enum zu löschen.
Das Schema im GraphiQL erkunden
Der Tab Test jeder API enthält das GraphiQL — die interaktive Umgebung des Endpunkts der App. Sie schreiben die Operation links, führen aus, und sehen die Antwort rechts; die Vervollständigung kennt das ganze Schema, Tabellen-Operationen eingeschlossen. Der Button In Fenster öffnen gibt Ihnen dieselbe Umgebung im Vollbild.

Da Sie auf der Plattform authentifiziert sind, führt das GraphiQL wie ein Client aus, sieht aber auch die Entwürfe — jede Operation im Entwurf erscheint mit der Beschreibung „RASCUNHO" in der Dokumentation des Schemas. Und es antwortet über Ihre Arbeitsversion: Was Sie gerade entwerfen, ist das, was Sie gerade testen.
Warum nicht…?
- Warum sehe ich die Operation
getContasvon außen nicht? Entweder ist die API im Entwurf (veröffentlichen Sie sie), oder die Aktion Select ist nicht aktiv, oder Ihr Schlüssel hat diesen Endpunkt nicht im Scope. - Warum erscheint ein Feld nicht in der Antwort? Es ist unter Enthaltene Felder nicht markiert — die Clients können nur auswählen, was die API einschließt.
- Warum gibt
addContaseintruestatt der Zeile zurück? Das hängt von der Datenbank hinter der Tabelle ab. Wenn Sie die Zeile immer brauchen, lassen Sie eingetContasfolgen, gefiltert nach dem Schlüssel. - Warum hat sich das Schema geändert, ohne dass ich die APIs angefasst habe? Das Schema wird aus dem Modell generiert: Neue Spalten zu importieren, ein Enum zu ändern oder eine Entität zu deaktivieren spiegelt sich beim nächsten Aufruf in der API wider.