L'API GraphQL del modello
Le API di Tabella e lo schema GraphQL generato dal modello dati — operazioni CRUD, filtri, ordinamento, paginazione, totali ed enum.
Ogni app di Keplin serve un'API GraphQL su un endpoint proprio. Lo schema di quell'API non si scrive a mano: è generato da due fonti — le API che costruisci nel costruttore e il modello dati dell'app. Le tabelle del modello diventano tipi GraphQL con i loro campi e le loro relazioni; gli enum del modello diventano enum GraphQL; e un'API di Tabella trasforma una tabella in operazioni di lettura e scrittura complete, con filtri, ordinamento e paginazione, senza che tu scriva una riga di SQL.
Questa pagina copre l'endpoint, le API di Tabella e il linguaggio di interrogazione che offrono ai client.
L'endpoint dell'app
Tutte le operazioni di un'app sono servite su un unico endpoint GraphQL:
POST /api/graphql/<endereco-da-app>
Nell'app di esempio, POST /api/graphql/gestao-clientes. La richiesta è un
JSON con query e variables, come in qualsiasi servizio GraphQL — la
scheda Docs di ogni API ti dà esempi pronti da copiare. Quando l'
app è pubblicata su un indirizzo proprio, lo stesso servizio risponde anche
su /api/graphql di quell'indirizzo.
Chi può chiamare l'endpoint:
| Chi chiama | Come si autentica | Che cosa vede |
|---|---|---|
| Le schermate dell'app | Sessione dell'utente dell'app (automatico) | API pubblicate |
| Sistemi esterni | Header x-api-key — vedi Chiavi di API |
API pubblicate dentro l'ambito della chiave |
| Chi costruisce | Sessione sulla piattaforma | API pubblicate E bozze (contrassegnate come bozza) |
| Anonimi | Nulla | Soltanto API pubbliche |
Nota
Contano anche le versioni dell'app: una chiave API e le richieste anonime parlano sempre con la versione principale (o con la versione pubblicata dell' indirizzo usato); chi costruisce vede la SUA versione di lavoro. Una chiave non intercetta mai, per caso, ciò che un developer sta cambiando in quel momento.
Creare un'API di Tabella
- Crea un'API (Nuova API) con il nome
che farà da base alle operazioni — per esempio
contas. - Nella scheda Costruisci, sezione Pipeline, premi il pulsante Tabella. Il blocco Tabella occupa l'intera pipeline — non si combina con passaggi SQL, HTTP o Script.
- Scegli la tabella nel selettore Scegli la tabella… — le tabelle appaiono raggruppate per datasource, con ricerca per nome di tabella o di datasource.
- Attiva le Azioni esposte e regola i Campi inclusi (vedi più sotto).
- Salva. Per pubblicare, servono una tabella scelta e almeno un'azione attiva.


Nota
Il selettore mostra solo le tabelle importate nel modello dati. Se è vuoto, importa prima le tabelle nella scheda Modello di un datasource.
Azioni esposte
Ogni azione attiva genera un'operazione nello schema, con il nome derivato dalla
base — per l'API contas:
| Azione | Operazione generata | Che cosa fa |
|---|---|---|
| Select | getContas (query) |
Elenco con filtri/ordinamento/paginazione. Porta con sé countContas, il totale. |
| Insert | addContas (mutation) |
Crea una riga. |
| Update | updateContas (mutation) |
Aggiorna una riga per chiave primaria — parziale: cambia solo ciò che invii. |
| Delete | deleteContas (mutation) |
Elimina una riga per chiave primaria e restituisce true. |
La riga Accesso pubblico (senza sessione) controlla, azione per azione, ciò che le schermate pubbliche possono chiamare — dettagli in API pubbliche.
Campi inclusi
L'albero Campi inclusi definisce la forma della risposta: deseleziona i
campi che non vuoi esporre, ed espandi i campi di navigazione per
includere le entità correlate — ricorsivamente, come in un editor GraphQL
visuale. In un'API contas, espandere il navigator contactos fa sì che
i client possano chiedere i contatti di ogni account nella stessa chiamata.

Atenção
Con Insert o Update attivi, i campi obbligatori della tabella (non nulli, senza valore automatico) sono sempre inclusi — senza di essi non sarebbe possibile creare righe valide. Il costruttore li mostra selezionati e bloccati.
Leggere dati: filtri, ordinamento, paginazione
La query di elenco accetta quattro argomenti: where, order, take e
skip. Un esempio completo nell'app Gestione Clienti:
query {
getContas(
where: { cidade: { eq: "Lisboa" }, estado: { neq: "ARQUIVADA" } }
order: [{ nome: ASC }]
take: 20
skip: 0
) {
id
nome
cidade
contactos {
nome
email
}
}
}
L'argomento where
Ogni campo filtrabile accetta gli operatori a seconda del tipo:
| Tipo del campo | Operatori |
|---|---|
| Testo (ed enum) | eq, neq, contains, startsWith, endsWith, gt, gte, lt, lte, in, nin |
Numeri (Int, Float) |
eq, neq, gt, gte, lt, lte, in, nin |
Boolean |
eq, neq |
ID |
eq, neq, in, nin |
E due combinatori per condizioni composte: and e or, che ricevono
elenchi di filtri.
where: {
or: [
{ cidade: { eq: "Lisboa" } }
{ cidade: { eq: "Porto" } }
]
valorAnual: { gte: 10000 }
}
Regole utili:
eq: nulltrova i record con il campo vuoto;neq: null, quelli compilati.- Intervalli di date: le date salvate come testo ISO (es.
2026-08-11) si ordinano alfabeticamente come si ordinano nel tempo, perciògt/lt/gte/ltesu testo bastano per filtrare gli intervalli —dataCriacao: { gte: "2026-01-01", lt: "2026-07-01" }. inriceve un elenco di valori;ninlo esclude.- I valori del filtro vanno sempre parametrizzati al database —
un
containscon testo malevolo non è un rischio.
Ordinare e paginare
orderè un elenco di{ campo: ASC }o{ campo: DESC }— più elementi ordinano per più campi, nell'ordine dato.takelimita il numero di righe (tetto di 10 000 per richiesta) eskipsalta le prime N — insieme fanno la paginazione classica.
Il totale: count
Ogni API di Tabella con Select attivo guadagna anche count<Nome>, che
restituisce il totale delle righe dello STESSO where. La coppia naturale di una tabella
paginata è chiedere la pagina e il totale in una sola operazione, con gli alias:
query {
items: getContas(take: 10, skip: 0) { id nome }
total: countContas
}
Con un filtro, passa lo stesso where a entrambi i campi — il totale conta
esattamente le righe che l'elenco restituirebbe senza paginazione.
Scrivere dati
addContasriceve i campi inclusi come argomenti (quelli obbligatori della tabella sono obbligatori nella mutation). In alcuni database la risposta è la riga creata; in altri,true— la scheda Docs dell' API mostra la forma esatta nel tuo caso.updateContasriceve la chiave primaria (obbligatoria) e gli altri campi come opzionali — aggiorna solo ciò che invii — e restituisce la riga aggiornata.deleteContasriceve la chiave primaria e restituiscetrue.
mutation ($nome: String!, $cidade: String) {
addContas(nome: $nome, cidade: $cidade) {
id
nome
}
}
Nota
I permessi dell'app si applicano qui, sempre: se l'utente dell'app
può vedere solo gli account della sua squadra, getContas e countContas
restituiscono — e contano — solo quelli, chiunque li chiami (schermata, report
o workflow).
Enum
Un enum espone un insieme fisso di valori nello schema GraphQL — lo stato di un account, la fase di un'opportunità. Si gestiscono nella pagina API, scheda Enum:
- Premi Nuovo enum.
- Dai un nome (es.
EstadoConta) e, se aiuta, una descrizione. - Aggiungi valori con Aggiungi valore — ogni valore ha un identificatore (value), un'etichetta e un colore opzionali. Il colore e l'etichetta sono usati dalle schermate; il value è ciò che viaggia nell'API.
- Salva.


Un enum si usa in due posti: come tipo di un campo del modello (il campo comincia ad accettare soltanto quei valori, e nei filtri si comporta come testo) e come tipo di argomento di un'API. Nello schema, i client vedono l' enum con i suoi valori — il completamento automatico dell'ambiente di test li suggerisce.
Atenção
Eliminare un enum è permanente e i campi/argomenti che lo usavano smettono di referenziarlo. Preferisci modificare i valori piuttosto che eliminare l'enum.
Esplorare lo schema in GraphiQL
La scheda Prova di qualsiasi API include GraphiQL — l'ambiente interattivo dell'endpoint dell'app. Scrivi l'operazione a sinistra, esegui, e vedi la risposta a destra; il completamento automatico conosce l'intero schema, operazioni di Tabella comprese. Il pulsante Apri in finestra ti dà lo stesso ambiente a schermo intero.

Siccome sei autenticato sulla piattaforma, GraphiQL esegue come un client ma vede anche le bozze — ogni operazione in bozza appare con la descrizione "RASCUNHO" nella documentazione dello schema. E risponde sulla tua versione di lavoro: ciò che stai disegnando è ciò che stai provando.
Perché no…?
- Perché non vedo l'operazione
getContasdall'esterno? O l'API è in bozza (pubblicala), o l'azione Select non è attiva, oppure la tua chiave non ha quell'endpoint nell'ambito. - Perché non appare un campo nella risposta? Non è selezionato in Campi inclusi — i client possono selezionare solo ciò che l'API include.
- Perché
addContasrestituisce untrueinvece della riga? Dipende dal database dietro la tabella. Quando ti serve sempre la riga, fai seguire ungetContasfiltrato per chiave. - Perché lo schema è cambiato senza che io toccassi le API? Lo schema è generato dal modello: importare colonne nuove, cambiare un enum o disattivare un' entità si riflette nell'API alla chiamata successiva.