didattiko
Registro elettronico

API per gli sviluppatori

API REST in sola lettura del registro elettronico, per i programmi autorizzati dalla scuola. Versione 1.0.0 · OpenAPI 3.0.3

Specifica OpenAPI (JSON)Stato del servizio

Per iniziare

  1. Il dirigente scolastico crea l'applicazione nel registro, in «API e applicazioni», scegliendo cosa può leggere e la scadenza (al massimo 12 mesi). Riceve client_id e client_secret: il secret si vede una volta sola e va conservato come una password, mai nel codice pubblicato o nel browser.
  2. Il programma chiede un token con OAuth 2.0 client credentials; vale 15 minuti:
    curl -s -u "$CLIENT_ID:$CLIENT_SECRET" \
      -d grant_type=client_credentials \
      https://prova.didattiko.com/api/v1/oauth/token
    {
      "access_token": "dka_VtX7m2…",
      "token_type": "Bearer",
      "expires_in": 900,
      "scope": "classes:read students:read"
    }
  3. Il programma legge i dati inviando il token nell'intestazione Authorization:
    curl -s -H "Authorization: Bearer $TOKEN" \
      "https://prova.didattiko.com/api/v1/classes?limit=20"
Esempi in JavaScript e Python
// Node.js 18 o successivo (fetch incluso)
const base = "https://prova.didattiko.com/api/v1";
const basic = Buffer.from(`${process.env.CLIENT_ID}:${process.env.CLIENT_SECRET}`).toString("base64");

async function token() {
  const r = await fetch(`${base}/oauth/token`, {
    method: "POST",
    headers: { Authorization: `Basic ${basic}`, "Content-Type": "application/x-www-form-urlencoded" },
    body: "grant_type=client_credentials",
  });
  if (!r.ok) throw new Error((await r.json()).detail ?? r.statusText);
  return (await r.json()).access_token; // vale 15 minuti: chiedine uno nuovo quando scade
}

const t = await token();
// tutte le pagine dell'elenco, seguendo _links.next
for (let url = `${base}/students?limit=200`; url; ) {
  const r = await fetch(url, { headers: { Authorization: `Bearer ${t}` } });
  if (r.status === 429) { await new Promise((ok) => setTimeout(ok, Number(r.headers.get("Retry-After")) * 1000)); continue; }
  const page = await r.json();
  for (const s of page.items) console.log(s.className, s.familyName, s.givenName);
  url = page._links.next;
}
# Python 3 con la libreria requests
import os, requests
base = "https://prova.didattiko.com/api/v1"
t = requests.post(f"{base}/oauth/token", data={"grant_type": "client_credentials"},
                  auth=(os.environ["CLIENT_ID"], os.environ["CLIENT_SECRET"]), timeout=10).json()["access_token"]
r = requests.get(f"{base}/attendance", params={"date": "2026-10-22"},
                 headers={"Authorization": f"Bearer {t}"}, timeout=10)
r.raise_for_status()
for e in r.json()["items"]:
    print(e["type"], e["studentId"], e["justificationStatus"])

Accesso e sicurezza

  • OAuth 2.0 client credentials (RFC 6749 §4.4) all'indirizzo https://prova.didattiko.com/api/v1/oauth/token: credenziali con l'intestazione Authorization: Basic (consigliato) o nel corpo application/x-www-form-urlencoded (client_id, client_secret). Con scope (ambiti separati da spazi) si chiede solo una parte degli ambiti dell'applicazione.
  • Token Bearer (RFC 6750) di 15 minuti. Credenziali e token mai nell'indirizzo: una richiesta con access_token tra i parametri viene rifiutata.
  • Solo HTTPS (TLS con autenticazione del server, profilo ID_AUTH_CHANNEL_01 del Modello di interoperabilità). Il registro conserva solo l'impronta SHA-256 di secret e token.
  • Una scuola per applicazione: le risorse di un'altra scuola rispondono 404. Il dirigente può limitare gli indirizzi IP da cui l'applicazione chiama e la può revocare in ogni momento: i token già rilasciati smettono subito di valere.
  • Registro attività: ogni chiamata (anche rifiutata) entra nel registro della scuola, a prova di manomissione, con applicazione, indirizzo, operazione, parametri, esito e identificativo della richiesta (Request-Id). Il dirigente lo consulta nel registro.
  • Dieci secret sbagliati per la stessa applicazione in 15 minuti bloccano temporaneamente le richieste di token; troppe chiamate senza un token valido dallo stesso indirizzo vengono fermate con 429.

Ambiti (scope)

AmbitoCosa permette di leggereOperazioni
school:read
Scuola e calendario
Dati della scuola e dei plessi, anni scolastici con i periodi, calendario scolastico con feste, vacanze e giorni senza lezione.
classes:read
Classi, materie e orario
Classi dell'anno, materie, docenti di ogni classe (solo nome e cognome) e orario settimanale. Il sostegno non compare.
students:read
Alunni (dati minimi)
Nome, cognome, classe e numero di registro. Mai codice fiscale, data di nascita, recapiti o dati sanitari.
attendance:read
Presenze del giorno
Assenze, ritardi, uscite e fuori classe con l'orario e lo stato della giustificazione. Mai motivi, causali, deroghe o note.
grades:read
Voti pubblicati
Solo i voti già visibili alle famiglie, con materia, data, tipo e argomento della prova. Mai commenti o annotazioni riservate.
agenda:read
Agenda e compiti
Verifiche, promemoria e compiti per tutta la classe. Non escono la parte riservata ai docenti né le voci per singoli alunni.
audit:read
Registro attività (per il SIEM)
Chi ha fatto cosa e quando, con l'impronta della catena: per il sistema di monitoraggio della sicurezza. Senza i dettagli delle operazioni.
monitoring:read
Monitoraggio del servizio
Stato del registro minuto per minuto (risposta del database, errori, code di posta e SMS), disponibilità e allarmi della scuola. Nessun dato personale.
costs:read
Contratto e costi
Canone del contratto, alunni conteggiati e consumi del mese (SMS a pagamento, e-mail, spazio dei file, chiamate API). Nessun dato personale.

Convenzioni: JSON, date, elenchi

  • Risposte application/json in UTF-8, proprietà in camelCase (solo la risposta del token usa lo snake_case di OAuth 2.0). Le enumerazioni sono stringhe mai nulle, gli elenchi vuoti sono [], i valori sì/no non sono mai nulli.
  • Date RFC 3339: giorni come 2026-10-22; istanti in UTC con la Z (2026-10-22T07:41:12Z); gli orari di lezione, ritardi e uscite in ora locale della scuola con lo scarto (2026-10-22T08:00:00+02:00).
  • Elenchi come oggetto { items, limit, offset, total, _links }: parametri limit (predefinito 50, massimo 200) e offset; in _links gli indirizzi assoluti di self, next e prev. Il registro attività usa un cursore (cursor = ultimo seq ricevuto).
  • Filtri come parametri dell'indirizzo (es. classId, date, from, to). Un parametro sconosciuto o scritto male dà errore 400 invece di restituire tutto.
  • Nessuna copia in cache (Cache-Control: no-store); ogni risposta ha Request-Id e il rimando alla specifica (Link: <…/openapi.json>; rel="service-desc").
  • Stato del servizio in https://prova.didattiko.com/api/v1/status (oggetto Problem con stato 200), senza token.

Limiti di frequenza

Ogni applicazione ha un numero di richieste al minuto scelto dal dirigente (30, 60, 120, 300; predefinito 60), comprese le richieste di token. Ogni risposta riporta X-RateLimit-Limit, X-RateLimit-Remaining e X-RateLimit-Reset (secondi alla ripartenza). Oltre il limite la risposta è 429 con Retry-After in secondi: aspetta e riprova. Con il servizio in manutenzione la risposta è 503, anch'essa con Retry-After.

Errori

Gli errori sono oggetti Problem (RFC 9457, application/problem+json): type rimanda alla spiegazione qui sotto, instance identifica la richiesta (da comunicare al supporto). Gli errori di /oauth/token hanno anche error ed error_description di OAuth 2.0. Per non dare indizi, credenziali sbagliate, revocate o scadute danno lo stesso errore.

HTTP/1.1 403 Forbidden
Content-Type: application/problem+json; charset=utf-8
WWW-Authenticate: Bearer realm="didattiko", error="insufficient_scope", scope="grades:read"
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 57
X-RateLimit-Reset: 41

{
  "type": "https://prova.didattiko.com/sviluppatori#errore-ambito-mancante",
  "title": "Ambito non concesso",
  "status": 403,
  "detail": "Serve l'ambito «grades:read».",
  "instance": "urn:uuid:3f0c7a52-8d1e-4c43-a6c1-2b8e1a0f9d11",
  "requiredScope": "grades:read"
}
StatoTipoQuando
400Richiesta non valida
errore-richiesta-non-valida
Un parametro manca, è sconosciuto o ha un valore non valido: il campo «detail» dice quale.
401Credenziali non valide
errore-credenziali-non-valide
client_id o client_secret sbagliati, applicazione revocata o scaduta. Per sicurezza non si dice quale dei casi.
401Token mancante
errore-token-mancante
Serve l'intestazione «Authorization: Bearer <token>» con un token ottenuto da /oauth/token.
401Token non valido o scaduto
errore-token-non-valido
Il token è scaduto (dura 15 minuti), è sbagliato o l'applicazione è stata revocata: chiedine uno nuovo.
403Ambito non concesso
errore-ambito-mancante
L'applicazione non ha l'ambito (scope) richiesto dall'operazione: il dirigente può crearne una con gli ambiti giusti.
403Rete non consentita
errore-rete-non-consentita
L'applicazione può chiamare solo dagli indirizzi indicati dal dirigente alla creazione.
404Risorsa non trovata
errore-non-trovato
La risorsa non esiste o appartiene a un'altra scuola.
405Metodo non consentito
errore-metodo-non-consentito
L'API è in sola lettura: si usa GET (POST solo per /oauth/token).
415Tipo di contenuto non supportato
errore-tipo-non-supportato
/oauth/token accetta solo application/x-www-form-urlencoded.
429Troppe richieste
errore-troppe-richieste
Superato il limite di richieste al minuto dell'applicazione: riprova dopo i secondi indicati in «Retry-After».
403Serve HTTPS
errore-https-obbligatorio
In produzione l'API risponde solo su connessioni cifrate (TLS).
500Errore interno
errore-errore-interno
Errore imprevisto del server: riprova; se si ripete, comunica l'identificativo «instance» al supporto.
503Servizio non disponibile
errore-servizio-non-disponibile
Il servizio è in manutenzione o sovraccarico: riprova dopo i secondi indicati in «Retry-After».

Operazioni

Tutte in GET, sotto https://prova.didattiko.com/api/v1. Altri metodi rispondono 405.

Scuola

GET/school— Dati della scuola e dei plessi

Denominazione, codice meccanografico, indirizzo, recapiti istituzionali e plessi attivi.

Ambito: school:read · risposta: School

Esempio di risposta
{
  "id": "cm2x7k0a90001qw8z3l5d4f6h",
  "schoolCode": "NAIC8AB00C",
  "name": "Istituto Comprensivo «Dante Alighieri»",
  "taxCode": "",
  "address": {
    "street": "",
    "postalCode": "",
    "city": "",
    "province": "NA"
  },
  "phone": "",
  "email": "",
  "pec": "",
  "website": "",
  "currentSchoolYearId": "cm2x7k0a90001qw8z3l5d4f6h",
  "sites": [
    {
      "id": "cm2x7k0a90001qw8z3l5d4f6h",
      "name": "Plesso «G. Rodari»",
      "schoolCode": "",
      "level": "INFANZIA",
      "address": {
        "street": "",
        "city": ""
      }
    }
  ]
}

GET/school-years— Anni scolastici con i periodi

Date delle lezioni e periodi di valutazione (quadrimestri, trimestri…), dal più recente.

Ambito: school:read · risposta: SchoolYearList

Parametri di /school-years
ParametroTipoDescrizione
limitintero 1–200Elementi per pagina (predefinito 50, massimo 200)
offsetintero 0–1000000Elementi da saltare (predefinito 0)
Esempio di risposta
{
  "items": [
    {
      "id": "cm2x7k0a90001qw8z3l5d4f6h",
      "name": "2026/27",
      "lessonsStart": "2026-10-22",
      "lessonsEnd": "2026-10-22",
      "current": false,
      "periods": [
        {
          "id": "cm2x7k0a90001qw8z3l5d4f6h",
          "name": "Primo quadrimestre",
          "startDate": "2026-10-22",
          "endDate": "2026-10-22"
        }
      ]
    }
  ],
  "limit": 50,
  "offset": 0,
  "total": 3,
  "_links": {
    "self": "https://prova.didattiko.com/api/v1/school-years"
  }
}

GET/school-calendar— Calendario scolastico

Feste nazionali calcolate, vacanze, ponti, patrono, sospensioni e ore senza lezione dell'anno; con «classId» solo quelle che riguardano la classe.

Ambito: school:read · risposta: SchoolCalendar

Parametri di /school-calendar
ParametroTipoDescrizione
schoolYearIdtestoAnno scolastico (predefinito: quello in corso)
classIdtestoSolo questa classe
fromdata aaaa-mm-ggDal giorno (aaaa-mm-gg, RFC 3339 full-date)
todata aaaa-mm-ggAl giorno compreso (aaaa-mm-gg)
Esempio di risposta
{
  "schoolYearId": "cm2x7k0a90001qw8z3l5d4f6h",
  "lessonsStart": "2026-10-22",
  "lessonsEnd": "2026-10-22",
  "items": [
    {
      "kind": "FESTA",
      "title": "Vacanze di Natale",
      "from": "2026-10-22",
      "to": "2026-10-22",
      "wholeSchool": false,
      "classIds": [
        "cm2x7k0a90001qw8z3l5d4f6h"
      ],
      "wholeDay": false,
      "hours": [
        1
      ]
    }
  ]
}

Classi e orario

GET/classes— Classi dell'anno

Classi e sezioni dell'anno scolastico, con il numero di iscritti.

Ambito: classes:read · risposta: ClassList

Parametri di /classes
ParametroTipoDescrizione
schoolYearIdtestoAnno scolastico (predefinito: quello in corso)
leveltesto: INFANZIA | PRIMARIA | SECONDARIA_I | SECONDARIA_IISolo un ordine di scuola
siteIdtestoSolo un plesso
limitintero 1–200Elementi per pagina (predefinito 50, massimo 200)
offsetintero 0–1000000Elementi da saltare (predefinito 0)
Esempio di risposta
{
  "items": [
    {
      "id": "cm2x7k0a90001qw8z3l5d4f6h",
      "name": "3A",
      "grade": 3,
      "section": "A",
      "course": null,
      "level": "INFANZIA",
      "schoolYearId": "cm2x7k0a90001qw8z3l5d4f6h",
      "siteId": "cm2x7k0a90001qw8z3l5d4f6h",
      "studentCount": 24
    }
  ],
  "limit": 50,
  "offset": 0,
  "total": 3,
  "_links": {
    "self": "https://prova.didattiko.com/api/v1/classes"
  }
}

GET/classes/{classId}— Una classe con materie e docenti

La classe con le materie insegnate e i docenti (nome e cognome). Il sostegno non compare.

Ambito: classes:read · risposta: ClassDetail

Parametri di /classes/{classId}
ParametroTipoDescrizione
classId (nel percorso) *testoClasse
Esempio di risposta
{
  "id": "cm2x7k0a90001qw8z3l5d4f6h",
  "name": "3A",
  "grade": 3,
  "section": "A",
  "course": null,
  "level": "INFANZIA",
  "schoolYearId": "cm2x7k0a90001qw8z3l5d4f6h",
  "siteId": "cm2x7k0a90001qw8z3l5d4f6h",
  "studentCount": 24,
  "teachings": [
    {
      "subject": {
        "id": "cm2x7k0a90001qw8z3l5d4f6h",
        "name": "Matematica"
      },
      "teacher": {
        "id": "cm2x7k0a90001qw8z3l5d4f6h",
        "givenName": "Giulia",
        "familyName": "Rossi"
      }
    }
  ]
}

GET/classes/{classId}/timetable— Orario settimanale della classe

Le ore della settimana che contiene «date» (da lunedì a sabato), con la versione dell'orario in vigore, le settimane alterne e le ore senza lezione del calendario scolastico.

Ambito: classes:read · risposta: Timetable

Parametri di /classes/{classId}/timetable
ParametroTipoDescrizione
classId (nel percorso) *testoClasse
datedata aaaa-mm-ggGiorno (aaaa-mm-gg, predefinito: oggi)
Esempio di risposta
{
  "classId": "cm2x7k0a90001qw8z3l5d4f6h",
  "weekStart": "2026-10-19",
  "weekEnd": "2026-10-24",
  "items": [
    {
      "date": "2026-10-22",
      "weekday": 1,
      "hour": 1,
      "start": "2026-10-22T08:00:00+02:00",
      "end": "2026-10-22T09:00:00+02:00",
      "subject": {
        "id": "cm2x7k0a90001qw8z3l5d4f6h",
        "name": "Matematica"
      },
      "teacher": {
        "id": "cm2x7k0a90001qw8z3l5d4f6h",
        "givenName": "Giulia",
        "familyName": "Rossi"
      },
      "week": "TUTTE",
      "noLesson": false,
      "noLessonReason": null
    }
  ]
}

GET/subjects— Materie della scuola

Materie con sigla, colore e tipo. Il sostegno non compare.

Ambito: classes:read · risposta: SubjectList

Parametri di /subjects
ParametroTipoDescrizione
limitintero 1–200Elementi per pagina (predefinito 50, massimo 200)
offsetintero 0–1000000Elementi da saltare (predefinito 0)
Esempio di risposta
{
  "items": [
    {
      "id": "cm2x7k0a90001qw8z3l5d4f6h",
      "name": "Matematica",
      "shortName": "MAT",
      "color": "#2563eb",
      "kind": "ORDINARIA"
    }
  ],
  "limit": 50,
  "offset": 0,
  "total": 3,
  "_links": {
    "self": "https://prova.didattiko.com/api/v1/subjects"
  }
}

Alunni

GET/students— Alunni iscritti (dati minimi)

Nome, cognome, classe, numero di registro e data di ingresso in classe. Mai codice fiscale, data di nascita, recapiti, scelte sulla religione, dati sanitari o di inclusione.

Ambito: students:read · risposta: StudentList

Parametri di /students
ParametroTipoDescrizione
schoolYearIdtestoAnno scolastico (predefinito: quello in corso)
classIdtestoSolo questa classe
limitintero 1–200Elementi per pagina (predefinito 50, massimo 200)
offsetintero 0–1000000Elementi da saltare (predefinito 0)
Esempio di risposta
{
  "items": [
    {
      "id": "cm2x7k0a90001qw8z3l5d4f6h",
      "givenName": "Marco",
      "familyName": "Bianchi",
      "classId": "cm2x7k0a90001qw8z3l5d4f6h",
      "className": "3A",
      "registerNumber": 1,
      "enrolledSince": "2026-10-22"
    }
  ],
  "limit": 50,
  "offset": 0,
  "total": 3,
  "_links": {
    "self": "https://prova.didattiko.com/api/v1/students"
  }
}

Presenze

GET/attendance— Presenze del giorno

Assenze, ritardi, uscite e fuori classe di un giorno, con l'orario e lo stato della giustificazione. Mai motivi, causali, deroghe (spesso sanitarie), note o il motivo del fuori classe.

Ambito: attendance:read · risposta: AttendanceList

Parametri di /attendance
ParametroTipoDescrizione
datedata aaaa-mm-ggGiorno (aaaa-mm-gg, predefinito: oggi)
classIdtestoSolo questa classe
typetesto: ASSENZA | RITARDO | USCITA | FUORI_CLASSESolo un tipo di evento
limitintero 1–200Elementi per pagina (predefinito 50, massimo 200)
offsetintero 0–1000000Elementi da saltare (predefinito 0)
Esempio di risposta
{
  "items": [
    {
      "id": "cm2x7k0a90001qw8z3l5d4f6h",
      "studentId": "cm2x7k0a90001qw8z3l5d4f6h",
      "classId": "cm2x7k0a90001qw8z3l5d4f6h",
      "date": "2026-10-22",
      "type": "ASSENZA",
      "at": "2026-10-22T09:10:00+02:00",
      "hour": 1,
      "hourTo": 1,
      "justificationStatus": "NONE",
      "shortDelay": false,
      "recordedAt": "2026-10-22T07:41:12Z"
    }
  ],
  "limit": 50,
  "offset": 0,
  "total": 3,
  "_links": {
    "self": "https://prova.didattiko.com/api/v1/attendance"
  }
}

Voti

GET/grades— Voti pubblicati

Solo i voti già visibili alle famiglie (passato il ritardo di pubblicazione scelto dalla scuola; nessuno se la scuola non mostra i voti; se la scuola lo sceglie, non quelli del periodo di una classe in scrutinio fino alla pubblicazione delle pagelle). Predefinito: dall'inizio dell'anno a oggi, al massimo 400 giorni. Religione cattolica e attività alternativa non compaiono: rivelerebbero la scelta religiosa (art. 9 GDPR).

Ambito: grades:read · risposta: GradeList

Parametri di /grades
ParametroTipoDescrizione
classIdtestoSolo questa classe
studentIdtestoSolo questo alunno
subjectIdtestoSolo questa materia
kindtesto: SCRITTO | ORALE | PRATICOSolo un tipo di prova
fromdata aaaa-mm-ggDal giorno (aaaa-mm-gg, RFC 3339 full-date)
todata aaaa-mm-ggAl giorno compreso (aaaa-mm-gg)
limitintero 1–200Elementi per pagina (predefinito 50, massimo 200)
offsetintero 0–1000000Elementi da saltare (predefinito 0)
Esempio di risposta
{
  "items": [
    {
      "id": "cm2x7k0a90001qw8z3l5d4f6h",
      "studentId": "cm2x7k0a90001qw8z3l5d4f6h",
      "classId": "cm2x7k0a90001qw8z3l5d4f6h",
      "subject": {
        "id": "cm2x7k0a90001qw8z3l5d4f6h",
        "name": "Matematica"
      },
      "date": "2026-10-22",
      "kind": "SCRITTO",
      "display": "7½",
      "value": 7.5,
      "weight": 100,
      "countsInAverage": false,
      "annotation": false,
      "description": "",
      "recoveryOfId": "cm2x7k0a90001qw8z3l5d4f6h",
      "objectiveId": "cm2x7k0a90001qw8z3l5d4f6h",
      "publishedAt": "2026-10-22T07:41:12Z"
    }
  ],
  "limit": 50,
  "offset": 0,
  "total": 3,
  "_links": {
    "self": "https://prova.didattiko.com/api/v1/grades"
  }
}

Agenda e compiti

GET/agenda— Agenda di classe

Verifiche, promemoria e annotazioni per tutta la classe che toccano l'intervallo (predefinito: da oggi a 30 giorni, al massimo 120).

Ambito: agenda:read · risposta: AgendaList

Parametri di /agenda
ParametroTipoDescrizione
classIdtestoSolo questa classe
typetesto: VERIFICA | PROMEMORIA | ANNOTAZIONESolo un tipo
fromdata aaaa-mm-ggDal giorno (aaaa-mm-gg, RFC 3339 full-date)
todata aaaa-mm-ggAl giorno compreso (aaaa-mm-gg)
limitintero 1–200Elementi per pagina (predefinito 50, massimo 200)
offsetintero 0–1000000Elementi da saltare (predefinito 0)
Esempio di risposta
{
  "items": [
    {
      "id": "cm2x7k0a90001qw8z3l5d4f6h",
      "classId": "cm2x7k0a90001qw8z3l5d4f6h",
      "type": "VERIFICA",
      "title": "Verifica di storia",
      "description": "",
      "date": "2026-10-22",
      "dateTo": "2026-10-22",
      "hour": 1,
      "createdAt": "2026-10-22T07:41:12Z"
    }
  ],
  "limit": 50,
  "offset": 0,
  "total": 3,
  "_links": {
    "self": "https://prova.didattiko.com/api/v1/agenda"
  }
}

GET/homework— Compiti per la classe

Compiti per tutta la classe con la consegna nell'intervallo (predefinito: da oggi a 30 giorni, al massimo 120).

Ambito: agenda:read · risposta: HomeworkList

Parametri di /homework
ParametroTipoDescrizione
classIdtestoSolo questa classe
subjectIdtestoSolo questa materia
fromdata aaaa-mm-ggDal giorno (aaaa-mm-gg, RFC 3339 full-date)
todata aaaa-mm-ggAl giorno compreso (aaaa-mm-gg)
limitintero 1–200Elementi per pagina (predefinito 50, massimo 200)
offsetintero 0–1000000Elementi da saltare (predefinito 0)
Esempio di risposta
{
  "items": [
    {
      "id": "cm2x7k0a90001qw8z3l5d4f6h",
      "classId": "cm2x7k0a90001qw8z3l5d4f6h",
      "subject": {
        "id": "cm2x7k0a90001qw8z3l5d4f6h",
        "name": "Matematica"
      },
      "assignedDate": "2026-10-22",
      "dueDate": "2026-10-22",
      "description": "",
      "part": 1,
      "parts": 1,
      "partDescription": "",
      "createdAt": "2026-10-22T07:41:12Z"
    }
  ],
  "limit": 50,
  "offset": 0,
  "total": 3,
  "_links": {
    "self": "https://prova.didattiko.com/api/v1/homework"
  }
}

Sicurezza

GET/audit-events— Registro attività (per il SIEM)

Righe del registro attività della scuola in ordine di numero, dopo il cursore: si riparte dal «seq» dell'ultima riga ricevuta. Con le impronte della catena, senza i dettagli delle operazioni. Anche le chiamate all'API sono nel registro (azione «api.call»).

Ambito: audit:read · risposta: AuditEventList

Parametri di /audit-events
ParametroTipoDescrizione
cursorintero 0–2000000000Ultimo «seq» già ricevuto (predefinito 0)
fromdata aaaa-mm-ggDal giorno (aaaa-mm-gg, RFC 3339 full-date)
limitintero 1–500Righe per pagina (predefinito 100, massimo 500)
Esempio di risposta
{
  "items": [
    {
      "seq": 1287,
      "at": "2026-10-22T07:41:12Z",
      "action": "grade.create",
      "entity": "Grade",
      "entityId": "cm2x7k0a90001qw8z3l5d4f6h",
      "userId": "cm2x7k0a90001qw8z3l5d4f6h",
      "ip": null,
      "prevHash": null,
      "hash": null
    }
  ],
  "limit": 1,
  "cursor": 0,
  "_links": {
    "self": "https://prova.didattiko.com/api/v1/audit-events"
  }
}

Servizio

GET/service-status— Monitoraggio del servizio

Stato del registro minuto per minuto (risposta del database, errori, code di posta e SMS), disponibilità a 24 ore, 7, 30 e 90 giorni e allarmi della scuola, per il sistema di monitoraggio della scuola. Nessun dato personale.

Ambito: monitoring:read · risposta: ServiceStatus

Parametri di /service-status
ParametroTipoDescrizione
minutesintero 1–1440Minuti da restituire (predefinito 60, massimo 1440)
Esempio di risposta
{
  "state": "OPERATIVO",
  "checkedAt": "2026-10-22T07:41:12Z",
  "availability": {
    "last24h": 99.95,
    "last7d": 99.95,
    "last30d": 99.95,
    "last90d": 99.95
  },
  "minutes": [
    {
      "minute": "2026-10-22T07:41:12Z",
      "state": "OPERATIVO",
      "databaseMs": 4,
      "errors": 0,
      "processDelayMs": 12,
      "mailBacklog": 0,
      "smsBacklog": 0
    }
  ],
  "alerts": [
    {
      "id": "cm2x7k0a90001qw8z3l5d4f6h",
      "metric": "NON_RAGGIUNGIBILE",
      "threshold": 800,
      "minutes": 3,
      "active": false,
      "firing": false
    }
  ]
}

GET/costs— Contratto e costi

Canone dal contratto, alunni conteggiati e consumi del mese in corso, calcolati a ogni richiesta (Allegato 4 ACN, QU.PR-01). Importi in centesimi di euro.

Ambito: costs:read · risposta: CostReport

Esempio di risposta
{
  "month": "2026-10",
  "generatedAt": "2026-10-22T07:41:12Z",
  "schoolYear": "2026/27",
  "contract": {
    "plan": "",
    "startDate": "2026-10-22",
    "endDate": "2026-10-22",
    "annualFeeCents": 120000,
    "perStudentCents": 150,
    "includedStudents": 500,
    "smsIncluded": 0,
    "vatPercent": 22
  },
  "students": 640,
  "annualFee": {
    "extraStudents": 140,
    "netCents": 141000,
    "grossCents": 172020
  },
  "monthly": {
    "feeCents": 14335,
    "smsMessages": 12,
    "smsSegments": 12,
    "smsExtraCents": 54,
    "totalCents": 14389
  },
  "included": {
    "emails": 830,
    "files": 1200,
    "storageBytes": 524288000,
    "aiDrafts": 3,
    "apiCalls": 4200
  },
  "budgetEuro": 50
}

Schemi dei dati

Problem

Errore secondo RFC 9457 (Problem Details for HTTP APIs), media type application/problem+json.

Proprietà di Problem
ProprietàTipoDescrizione
typeindirizzoTipo di errore: rimanda alla sua spiegazione nella documentazione
titletestoTitolo breve del tipo di errore
statusintero 100–599Stato HTTP
detail (facoltativa)testoSpiegazione di questa occorrenza
instanceindirizzoIdentificativo della richiesta (urn:uuid), da comunicare al supporto
requiredScope (facoltativa)testoAmbito che sarebbe servito (solo per «ambito-mancante»)
invalidParams (facoltativa)elenco di oggettoParametri non validi (solo per «richiesta-non-valida»)
error (facoltativa)testoCodice d'errore OAuth 2.0 (solo per /oauth/token, RFC 6749 §5.2)
error_description (facoltativa)testoDescrizione dell'errore OAuth 2.0 (solo per /oauth/token)

TokenResponse

Risposta di RFC 6749 §5.1 (nomi in snake_case come prevede lo standard OAuth 2.0)

Proprietà di TokenResponse
ProprietàTipoDescrizione
access_tokentestoToken di accesso da inviare con «Authorization: Bearer …»
token_typetesto: BearerTipo di token
expires_inintero 1–900Secondi di validità
scopetestoAmbiti concessi, separati da spazi

Person

Persona: solo identificativo, nome e cognome

Proprietà di Person
ProprietàTipoDescrizione
idtestoIdentificativo
givenNametestoNome
familyNametestoCognome

SubjectRef

Proprietà di SubjectRef
ProprietàTipoDescrizione
idtestoIdentificativo
nametestoMateria

Address

Proprietà di Address
ProprietàTipoDescrizione
streettestoVia e numero civico
postalCode (facoltativa)testoCAP
citytestoComune
province (facoltativa)testoSigla della provincia

Site

Plesso o sede

Proprietà di Site
ProprietàTipoDescrizione
idtestoIdentificativo
nametestoNome del plesso
schoolCodetestoCodice meccanografico del plesso (vuoto se non indicato)
leveltesto: INFANZIA | PRIMARIA | SECONDARIA_I | SECONDARIA_II | PIU_ORDINIOrdine di scuola del plesso
addressoggetto

School

Scuola dell'applicazione: un'applicazione vede solo la propria scuola

Proprietà di School
ProprietàTipoDescrizione
idtestoIdentificativo
schoolCodetestoCodice meccanografico
nametestoDenominazione
taxCodetestoCodice fiscale dell'istituzione scolastica
addressAddress
phonetestoTelefono
emailtestoPosta elettronica istituzionale
pectestoPosta elettronica certificata
websitetestoSito web
currentSchoolYearIdtesto o nullAnno scolastico in corso (null se non ancora creato)
siteselenco di SitePlessi attivi

Period

Proprietà di Period
ProprietàTipoDescrizione
idtestoIdentificativo
nametestoNome del periodo
startDatedata aaaa-mm-ggInizio
endDatedata aaaa-mm-ggFine

SchoolYear

Anno scolastico con i periodi

Proprietà di SchoolYear
ProprietàTipoDescrizione
idtestoIdentificativo
nametestoAnno scolastico
lessonsStartdata aaaa-mm-ggInizio delle lezioni
lessonsEnddata aaaa-mm-ggFine delle lezioni
currenttrue o falseÈ l'anno in corso
periodselenco di PeriodPeriodi di valutazione

SchoolYearList

Anni scolastici, dal più recente

Proprietà di SchoolYearList
ProprietàTipoDescrizione
itemselenco di SchoolYearElementi della pagina
limitintero 1–200Elementi per pagina
offsetintero 0–1000000Elementi saltati
totalintero 0–2147483647Elementi in tutto con questi filtri
_linksLinks

CalendarItem

Giorno o periodo senza lezione

Proprietà di CalendarItem
ProprietàTipoDescrizione
kindtesto: FESTA | VACANZA | PONTE | PATRONO | SOSPENSIONE | ALTROFESTA = festività nazionale; gli altri sono decisi dalla scuola o dalla regione
titletestoMotivo
fromdata aaaa-mm-ggPrimo giorno
todata aaaa-mm-ggUltimo giorno (uguale a «from» per un giorno solo)
wholeSchooltrue o falseVale per tutta la scuola (altrimenti solo per le classi in «classIds»)
classIdselenco di testoClassi interessate (vuoto = tutta la scuola)
wholeDaytrue o falseSenza lezione tutto il giorno (altrimenti solo nelle ore in «hours»)
hourselenco di intero 1–12Ore senza lezione (vuoto = tutto il giorno)

SchoolCalendar

Calendario scolastico

Proprietà di SchoolCalendar
ProprietàTipoDescrizione
schoolYearIdtesto o nullAnno scolastico
lessonsStartdata aaaa-mm-gg o nullInizio delle lezioni
lessonsEnddata aaaa-mm-gg o nullFine delle lezioni
itemselenco di CalendarItemFeste, vacanze e giorni o ore senza lezione in ordine di data

Class

Classe o sezione

Proprietà di Class
ProprietàTipoDescrizione
idtestoIdentificativo
nametestoNome
gradeintero 0–8Anno di corso (0 = sezione eterogenea dell'infanzia)
sectiontestoSezione
coursetesto o nullIndirizzo di studio
leveltesto: INFANZIA | PRIMARIA | SECONDARIA_I | SECONDARIA_IIOrdine di scuola
schoolYearIdtestoAnno scolastico
siteIdtesto o nullPlesso
studentCountintero 0–1000Alunni iscritti

ClassList

Classi in ordine di anno di corso e nome

Proprietà di ClassList
ProprietàTipoDescrizione
itemselenco di ClassElementi della pagina
limitintero 1–200Elementi per pagina
offsetintero 0–1000000Elementi saltati
totalintero 0–2147483647Elementi in tutto con questi filtri
_linksLinks

Teaching

Materia insegnata nella classe e docente (il sostegno non compare)

Proprietà di Teaching
ProprietàTipoDescrizione
subjectSubjectRef
teacherPerson

ClassDetail

Classe con le materie e i docenti

Proprietà di ClassDetail
ProprietàTipoDescrizione
idtestoIdentificativo
nametestoNome
gradeintero 0–8Anno di corso (0 = sezione eterogenea dell'infanzia)
sectiontestoSezione
coursetesto o nullIndirizzo di studio
leveltesto: INFANZIA | PRIMARIA | SECONDARIA_I | SECONDARIA_IIOrdine di scuola
schoolYearIdtestoAnno scolastico
siteIdtesto o nullPlesso
studentCountintero 0–1000Alunni iscritti
teachingselenco di TeachingMaterie e docenti della classe

Subject

Materia (il sostegno non compare)

Proprietà di Subject
ProprietàTipoDescrizione
idtestoIdentificativo
nametestoNome
shortNametestoSigla
colortestoColore usato nel registro
kindtesto: ORDINARIA | RELIGIONE | ALTERNATIVA | EDUCAZIONE_CIVICAReligione e attività alternativa hanno un giudizio fuori media; l'educazione civica è trasversale

SubjectList

Materie in ordine alfabetico

Proprietà di SubjectList
ProprietàTipoDescrizione
itemselenco di SubjectElementi della pagina
limitintero 1–200Elementi per pagina
offsetintero 0–1000000Elementi saltati
totalintero 0–2147483647Elementi in tutto con questi filtri
_linksLinks

TimetableSlot

Ora dell'orario in vigore quel giorno

Proprietà di TimetableSlot
ProprietàTipoDescrizione
datedata aaaa-mm-ggGiorno
weekdayintero 1–7Giorno della settimana (1 = lunedì … 6 = sabato)
hourintero 1–12Ora di lezione
startdata e ora RFC 3339Inizio, ora locale della scuola con lo scarto da UTC
enddata e ora RFC 3339Fine, ora locale della scuola con lo scarto da UTC
subjectSubjectRef
teacherPerson
weektesto: TUTTE | A | B | C | DSettimana del ciclo per gli orari a settimane alterne (TUTTE = ogni settimana)
noLessontrue o falseOra senza lezione per il calendario scolastico (festa, vacanza, sospensione) o fuori dal periodo delle lezioni
noLessonReasontesto o nullMotivo dell'ora senza lezione (null nelle ore di lezione), es. «Ponte dei Santi»

Timetable

Orario settimanale della classe (versione in vigore e settimane alterne già applicate)

Proprietà di Timetable
ProprietàTipoDescrizione
classIdtestoClasse
weekStartdata aaaa-mm-ggLunedì della settimana
weekEnddata aaaa-mm-ggSabato della settimana
itemselenco di TimetableSlotOre della settimana in ordine di giorno e ora

Student

Alunno con i soli dati minimi: mai codice fiscale, data di nascita, recapiti, dati sanitari o di inclusione

Proprietà di Student
ProprietàTipoDescrizione
idtestoIdentificativo
givenNametestoNome
familyNametestoCognome
classIdtestoClasse
classNametestoNome della classe
registerNumberintero 1–99 o nullNumero di registro
enrolledSincedata aaaa-mm-gg o nullIn classe dal (null = dall'inizio delle lezioni)

StudentList

Alunni in ordine di classe, cognome e nome

Proprietà di StudentList
ProprietàTipoDescrizione
itemselenco di StudentElementi della pagina
limitintero 1–200Elementi per pagina
offsetintero 0–1000000Elementi saltati
totalintero 0–2147483647Elementi in tutto con questi filtri
_linksLinks

AttendanceEvent

Evento di presenza. Mai motivi, causali, deroghe, note o il motivo del fuori classe

Proprietà di AttendanceEvent
ProprietàTipoDescrizione
idtestoIdentificativo
studentIdtestoAlunno
classIdtestoClasse
datedata aaaa-mm-ggGiorno
typetesto: ASSENZA | RITARDO | USCITA | FUORI_CLASSETipo di evento
atdata e ora RFC 3339 o nullOrario di entrata o uscita (ritardi e uscite), ora locale con lo scarto
hourintero 1–12 o nullOra di lezione di riferimento
hourTointero 1–12 o nullUltima ora (fuori classe su più ore)
justificationStatustesto: NONE | SUBMITTED | APPROVED | REJECTEDGiustificazione: da giustificare, inviata dalla famiglia, accettata, respinta
shortDelaytrue o falseRitardo breve entro la soglia della scuola (non va giustificato)
recordedAtdata e ora RFC 3339Momento della registrazione (UTC)

AttendanceList

Eventi del giorno in ordine di classe e ora

Proprietà di AttendanceList
ProprietàTipoDescrizione
itemselenco di AttendanceEventElementi della pagina
limitintero 1–200Elementi per pagina
offsetintero 0–1000000Elementi saltati
totalintero 0–2147483647Elementi in tutto con questi filtri
_linksLinks

Grade

Voto pubblicato. Mai commenti, annotazioni riservate, presa visione; religione e attività alternativa non compaiono

Proprietà di Grade
ProprietàTipoDescrizione
idtestoIdentificativo
studentIdtestoAlunno
classIdtestoClasse
subjectSubjectRef
datedata aaaa-mm-ggGiorno della prova
kindtesto: SCRITTO | ORALE | PRATICOTipo di prova
displaytestoVoto o giudizio come scritto dal docente
valuenumero o nullValore numerico (null per giudizi e annotazioni)
weightintero 0–1000Peso nella media in percentuale
countsInAveragetrue o falseEntra nella media
annotationtrue o falseAnnotazione della scala della scuola (es. impreparato): non è un voto
descriptiontestoArgomento della prova
recoveryOfIdtesto o nullVoto insufficiente recuperato da questo voto
objectiveIdtesto o nullObiettivo di apprendimento (primaria)
publishedAtdata e ora RFC 3339Da quando è visibile alla famiglia (UTC)

GradeList

Voti dal più recente

Proprietà di GradeList
ProprietàTipoDescrizione
itemselenco di GradeElementi della pagina
limitintero 1–200Elementi per pagina
offsetintero 0–1000000Elementi saltati
totalintero 0–2147483647Elementi in tutto con questi filtri
_linksLinks

AgendaEvent

Voce dell'agenda per tutta la classe (la parte riservata ai docenti e le voci per singoli alunni non escono)

Proprietà di AgendaEvent
ProprietàTipoDescrizione
idtestoIdentificativo
classIdtestoClasse
typetesto: VERIFICA | PROMEMORIA | ANNOTAZIONETipo
titletestoTitolo
descriptiontestoTesto visibile alle famiglie
datedata aaaa-mm-ggGiorno (primo giorno se dura più giorni)
dateTodata aaaa-mm-ggUltimo giorno (uguale a «date» per un giorno solo)
hourintero 1–12 o nullOra di lezione
createdAtdata e ora RFC 3339Inserito il (UTC)

AgendaList

Voci in ordine di data

Proprietà di AgendaList
ProprietàTipoDescrizione
itemselenco di AgendaEventElementi della pagina
limitintero 1–200Elementi per pagina
offsetintero 0–1000000Elementi saltati
totalintero 0–2147483647Elementi in tutto con questi filtri
_linksLinks

Homework

Compito per tutta la classe

Proprietà di Homework
ProprietàTipoDescrizione
idtestoIdentificativo
classIdtestoClasse
subjectSubjectRef
assignedDatedata aaaa-mm-ggAssegnato il
dueDatedata aaaa-mm-ggDa consegnare il
descriptiontestoTesto del compito
partintero 1–3 o nullNumero della consegna (compiti in più consegne)
partsintero 1–3 o nullConsegne del compito
partDescriptiontestoCosa consegnare in questa data
createdAtdata e ora RFC 3339Inserito il (UTC)

HomeworkList

Compiti in ordine di consegna

Proprietà di HomeworkList
ProprietàTipoDescrizione
itemselenco di HomeworkElementi della pagina
limitintero 1–200Elementi per pagina
offsetintero 0–1000000Elementi saltati
totalintero 0–2147483647Elementi in tutto con questi filtri
_linksLinks

AuditEvent

Riga del registro attività (senza i dettagli dell'operazione)

Proprietà di AuditEvent
ProprietàTipoDescrizione
seqintero 1–2147483647Numero progressivo nella catena della scuola
atdata e ora RFC 3339Momento (UTC)
actiontestoOperazione
entitytestoTipo di dato
entityIdtesto o nullDato interessato
userIdtesto o nullUtente (null per i processi automatici e le applicazioni collegate)
iptesto o nullIndirizzo del client
prevHashtesto o nullImpronta SHA-256 del record precedente
hashtesto o nullImpronta SHA-256 di questo record

ServiceMinute

Misura di un minuto

Proprietà di ServiceMinute
ProprietàTipoDescrizione
minutedata e ora RFC 3339Inizio del minuto (UTC)
statetesto: OPERATIVO | RALLENTATO | NON_DISPONIBILE | SENZA_DATIStato del minuto (la peggiore delle copie del server)
databaseMsintero -1–600000Tempo di risposta del database in millisecondi (-1 = non ha risposto)
errorsintero 0–1000000Errori del server nel minuto
processDelayMsintero 0–600000Ritardo del processo (99° percentile) in millisecondi
mailBacklogintero 0–2147483647E-mail in coda da più di 5 minuti
smsBacklogintero 0–2147483647SMS in coda da più di 5 minuti

ServiceAlert

Allarme scelto dalla scuola

Proprietà di ServiceAlert
ProprietàTipoDescrizione
idtestoIdentificativo
metrictesto: NON_RAGGIUNGIBILE | LENTEZZA | ERRORI | CODA_POSTA | CODA_SMS | SPESAChe cosa controlla
thresholdintero 0–2147483647Soglia (millisecondi, errori al minuto, messaggi in coda o euro)
minutesintero 1–60Minuti di fila oltre la soglia prima di avvisare
activetrue o falseAttivo
firingtrue o falseAllarme in corso

ServiceStatus

Monitoraggio del servizio (Allegato 3 ACN, QU.LS-04)

Proprietà di ServiceStatus
ProprietàTipoDescrizione
statetesto: OPERATIVO | RALLENTATO | NON_DISPONIBILE | SENZA_DATIStato attuale (SENZA_DATI se nessuna misura negli ultimi 3 minuti)
checkedAtdata e ora RFC 3339Momento della risposta (UTC)
availabilityoggettoDisponibilità in percentuale (null senza misure)
minuteselenco di ServiceMinuteMisure al minuto, dalla più vecchia
alertselenco di ServiceAlertAllarmi della scuola

CostReport

Contratto e costi della scuola (Allegato 4 ACN, QU.PR-01)

Proprietà di CostReport
ProprietàTipoDescrizione
monthtestoMese («AAAA-MM»)
generatedAtdata e ora RFC 3339Momento del calcolo (UTC): i valori sono calcolati a ogni richiesta
schoolYeartesto o nullAnno scolastico in corso
contractoggetto o nullContratto con il fornitore
studentsintero 0–2147483647Alunni conteggiati (iscritti nell'anno in corso)
annualFeeoggetto o nullCanone dell'anno con gli alunni di oggi
monthlyoggettoMese in corso
includedoggettoConsumi compresi nel canone
budgetEurointero 0–2147483647 o nullSoglia di spesa del mese scelta dalla scuola, in euro (null se non scelta)

AuditEventList

Righe del registro attività dopo il cursore: «next» c'è finché la pagina è piena

Proprietà di AuditEventList
ProprietàTipoDescrizione
itemselenco di AuditEventRighe in ordine di numero
limitintero 1–500Righe chieste
cursorintero 0–2147483647Numero dopo cui si è partiti
_linksLinks

Webhook (in preparazione)

Non ancora attivi Con i webhook il registro avviserà da solo il programma, invece di aspettare che chieda. Il dirigente sceglierà l'indirizzo https che riceve e gli eventi, tra quelli coperti dagli ambiti dell'applicazione:

  • attendance.recorded — Un evento di presenza appena registrato (stessi campi di /attendance: mai motivi o note). Ambito attendance:read.
  • grade.published — Un voto appena diventato visibile alla famiglia (stessi campi di /grades; mai religione e attività alternativa). Ambito grades:read.
  • homework.created — Un compito per tutta la classe appena inserito (stessi campi di /homework). Ambito agenda:read.

Ogni avviso è una POST in JSON firmata secondo Standard Webhooks: intestazioni webhook-id (uguale nei nuovi tentativi: serve a scartare i doppioni), webhook-timestamp (secondi Unix) e webhook-signature = v1, + base64 di HMAC-SHA256 di id.timestamp.corpo con la chiave della firma (whsec_…, mostrata una volta sola). Il programma risponde con uno stato 2xx entro 10 secondi; altrimenti il registro riprova dopo 1 minuto, 5 minuti, 30 minuti, 2, 6, 12 e 24 ore.

POST /didattiko HTTP/1.1
Content-Type: application/json; charset=utf-8
webhook-id: msg_2KWPBgLlAfxdpx2AI54pPJ
webhook-timestamp: 1792652400
webhook-signature: v1,K5oZfzN95Z9UVu1EsfQmfVNQhnkZ2pj9o9NDN/H/pI4=

{
  "type": "attendance.recorded",
  "timestamp": "2026-10-22T07:40:00Z",
  "data": {
    "id": "cm2x7k0a90001qw8z3l5d4f6h",
    "studentId": "cm2x7k0a90002qw8z9k1d2e3f",
    "classId": "cm2x7k0a90003qw8z4m5n6o7p",
    "date": "2026-10-22",
    "type": "RITARDO",
    "at": "2026-10-22T09:10:00+02:00",
    "hour": 2,
    "hourTo": null,
    "justificationStatus": "NONE",
    "shortDelay": false,
    "recordedAt": "2026-10-22T07:12:30Z"
  }
}
// Verifica della firma (Node.js) — oppure la libreria "standardwebhooks" per molti linguaggi
import { createHmac, timingSafeEqual } from "node:crypto";

function verify(secret, headers, body) {
  const id = headers["webhook-id"], ts = headers["webhook-timestamp"];
  if (Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false; // al massimo 5 minuti di scarto
  const key = Buffer.from(secret.replace(/^whsec_/, ""), "base64");
  const expected = createHmac("sha256", key).update(`${id}.${ts}.${body}`).digest();
  return headers["webhook-signature"].split(" ").some((s) => {
    const [v, sig] = s.split(",");
    const got = Buffer.from(sig ?? "", "base64");
    return v === "v1" && got.length === expected.length && timingSafeEqual(got, expected);
  });
}

Dati che non escono mai

L'API è pensata per i dati minimi (art. 5 e 25 GDPR). Non restituisce, con nessun ambito:

  • dati sanitari, diete, certificazioni, PEI, PDP, PFI e ogni altro dato dell'inclusione; docenti, ore e materia di sostegno;
  • note disciplinari, richiami, provvedimenti; motivi, causali e deroghe delle assenze; motivo del fuori classe;
  • commenti e annotazioni riservate dei voti, voti di religione cattolica e attività alternativa (rivelerebbero la scelta religiosa);
  • parte dell'agenda riservata ai docenti, compiti e voci d'agenda per singoli alunni;
  • codici fiscali, date di nascita, indirizzi, telefoni ed e-mail delle persone, tutori e deleghe;
  • i dettagli delle operazioni nel registro attività.

Condizioni d'uso

  • L'API si usa solo per i programmi autorizzati dalla scuola, che resta titolare del trattamento. Chi tratta dati personali per conto della scuola va nominato responsabile (art. 28 GDPR) prima di ricevere le credenziali.
  • Il secret si conserva come una password: mai nel codice pubblicato, nei browser, nelle app distribuite o nei messaggi in chiaro.
  • Si chiedono solo i dati che servono, si conservano solo per il tempo necessario e si rispettano i limiti di frequenza.
  • Un sospetto di furto delle credenziali o un incidente si comunica subito alla scuola, che revoca l'applicazione.

Versioni e supporto

La versione maggiore è nell'indirizzo (/api/v1), quella completa (Semantic Versioning) nella specifica: oggi 1.0.0. Dentro la v1 si aggiungono solo operazioni, parametri facoltativi e proprietà: i programmi devono ignorare le proprietà che non conoscono. Un cambiamento incompatibile diventa /api/v2, annunciato almeno un mese prima, con la v1 attiva per tutto l'anno scolastico.

Supporto tecnico per chi integra: supporto@didattiko.it, indicando l'instance o l'Request-Id della richiesta. Per le prove si usa un'applicazione creata su un'installazione dimostrativa con dati di fantasia.

Progettata seguendo le Linee guida AgID sull'interoperabilità tecnica delle Pubbliche Amministrazioni (Modello di interoperabilità) e le Raccomandazioni di implementazione (Allegato 4): descrizione OpenAPI, versione nell'indirizzo, percorsi in kebab-case, Problem JSON, X-RateLimit e Retry-After, date RFC 3339, nessuna cache, stato del servizio in /status, registro delle chiamate.

API per gli sviluppatori · didattiko