Sviluppatori
L'API di Meevia
Leggi l'agenda, prenoti appuntamenti e consulti il catalogo e l'anagrafica del paziente dal tuo sistema. Questa pagina ti porta dalla prima chiave alla prima risposta andata a buon fine.
In questa pagina
Che cos'è e a chi serve
L'API apre al tuo sistema le parti della clinica che ha senso automatizzare: l'agenda, il catalogo di professionisti e prestazioni, e l'anagrafica di base del paziente. Quello che fai attraverso di essa segue le stesse regole che valgono per chi manda avanti la clinica dentro la piattaforma.
È HTTP con JSON, senza librerie obbligatorie e senza SDK da installare. Se il tuo ambiente sa fare una richiesta e leggere una risposta, sa già parlare con Meevia.
Casi ricorrenti
- Un sito o un'app tua, dove il paziente sceglie l'orario e prenota da solo.
- Un sistema che la clinica già usa e che deve vedere l'agenda del giorno senza che nessuno digiti due volte.
- Automazione interna: un cruscotto tuo, un report, una routine che conferma le presenze.
Cosa deve avere la clinica
L'accesso all'API fa parte del piano della clinica. Se il piano attuale non lo comprende, già la prima chiamata torna rifiutata, e questo non lo risolve nessuna modifica al tuo codice: è una conversazione con il commerciale.
Cosa non c'è ancora
Questa versione legge e scrive l'agenda, e legge catalogo e paziente. Che sia Meevia ad avvisare il tuo sistema quando in clinica succede qualcosa, insieme alla fatturazione e ai pagamenti, non ne fa parte.
Come ottenere una chiave
La chiave nasce nel pannello sviluppatore, che sta su developers.meevia.app e ha un guscio suo, fuori dal sistema della clinica. È così perché chi realizza l'integrazione spesso non è della clinica. Non esiste alcuna strada, passando dall'API, per creare una chiave. L'interfaccia del pannello è in portoghese brasiliano, quindi i nomi di scheda e di permesso citati qui sotto sono esattamente quelli che leggerai a schermo.
- 1Apri il pannello sviluppatoreL'indirizzo è developers.meevia.app. Chi già lavora dentro il sistema della clinica arriva allo stesso posto da Integrações (Integrazioni), nel riquadro API e Webhooks, che è una porta verso il pannello.
- 2Entra con il tuo account, oppure chiedi un invitoChi amministra la clinica entra subito. Chi viene da fuori va invitato: nella scheda Acessos (Accessi), chi amministra il pannello invita per e-mail e sceglie tra Somente ver (sola visualizzazione), che consulta e non agisce, e Pode administrar (può amministrare), che emette anche chiavi. Chiedere l'invito è meglio che chiedere la chiave già pronta, perché una chiave che viaggia per messaggio è già uscita.
- 3Scegli la clinicaIl pannello serve tutte le cliniche a cui hai accesso, e quella scelta in alto è la padrona di tutto ciò che le schede mostrano. Se lavori per più di una, è qui che cambi.
- 4Nella scheda Chaves (Chiavi), crea una chiave nuovaDalle un nome che dica dove verrà usata. Sei mesi dopo, quel nome è l'unico modo di revocare la chiave giusta senza far cadere l'integrazione sbagliata.
- 5Scegli il modo e gli ambitiIl modo decide se la chiave tocca la clinica vera o l'ambiente di prova. Gli ambiti decidono cosa può fare. Spunta solo ciò che serve all'integrazione.
- 6Copia la chiave prima di chiudere la finestraLa chiave completa appare una volta sola, al momento dell'emissione. Meevia conserva il pezzo che la identifica e mai la parte segreta, quindi chiudere senza copiare non ha recupero: revoca la chiave ed emettine un'altra.
Una chiave, una clinica
La chiave vale per la clinica che l'ha emessa, e solo per quella. Se segui più cliniche, sono più chiavi, ciascuna custodita a parte e sostituibile senza toccare le altre. Non esiste una chiave che veda più di una clinica.
Dove custodirla
Tieni la chiave sul server, nella cassaforte delle variabili del tuo ambiente. Una chiave dentro il codice di un'applicazione o di una pagina è una chiave pubblicata, perché chiunque riesce a leggerla.
Quando revocare
Revocare vale all'istante e non si torna indietro: la chiave smette di funzionare e le sue chiamate iniziano a tornare rifiutate. Fallo quando cambi fornitore, quando spegni un'integrazione e al minimo sospetto di fuga.
Chi può fare cosa
Il ruolo Pode administrar nel pannello apre le due cose che cambiano qualcosa: emettere e revocare chiavi, e riavviare l'ambiente di prova. Si riceve per invito e vale per clinica, quindi chi viene da fuori fa entrambe senza dipendere da nessuno. Riavviare ha una seconda strada: anche chi amministra la clinica riavvia. Chi ha solo Somente ver vede le chiavi e non ne emette nessuna; il pannello lo dice a schermo, invece di nascondere il pulsante.
Autenticazione
Ogni chiamata parte autenticata. La chiave viaggia nell'intestazione di autorizzazione, con lo schema che mostra l'esempio, e non c'è altro: niente login, niente sessione, nessun token che scade a metà strada.
curl -X GET \
-H "Authorization: Bearer mv_live_a1b2c3d49f8e7d6c5b4a39281706f5e4d3c2b1a0" \
"https://wnricobmssysbwfhbmsm.supabase.co/functions/v1/api-v1/v1/practitioners"La chiave è un valore unico, ed è quel valore intero a viaggiare nell'intestazione. Ha tre pezzi incollati: il prefisso dice in che modo sta la chiave, il pezzo centrale la identifica ed è quello che compare nella scheda Chaves del pannello, e l'ultimo è la parte segreta. Quest'ultima Meevia non la conserva mai in chiaro, quindi nemmeno l'assistenza riesce a leggere la tua. Manda sempre la chiave completa: mandare solo la parte segreta è la svista che produce più rifiuti di autorizzazione.
Una chiave assente, scritta male, revocata o scaduta ricevono tutte lo stesso rifiuto, senza dire quale dei quattro casi fosse. È voluto. Dire quale significa dare un indizio a chi sta provando a indovinare.
Due modi
Produzione
mv_live_
Tocca la clinica vera. Un appuntamento creato da qui compare nell'agenda della reception e fa partire quello che la clinica ha impostato per partire.
Prova
mv_test_
Tocca un ambiente separato, con dati inventati, che esiste solo perché tu possa sperimentare. Niente di ciò che succede lì sfiora la clinica vera.
Il modo si decide all'emissione e dopo non cambia. In pratica tieni le due chiavi e cambi la variabile d'ambiente per passare da un lato all'altro.
La chiave che compare negli esempi è inventata e non funziona da nessuna parte: sta lì solo perché tu riconosca la forma della tua. Nota che il suo prefisso è di produzione. Se fai il passo passo in modo di prova, come questa pagina consiglia, la tua comincerà in modo diverso.
Ambiti
Ogni ambito apre una parte dell'API, e la chiave fa solo quello che i suoi ambiti permettono. La mancanza di un ambito si vede alla prima chiamata che ne ha bisogno, non all'emissione.
appointments:read
Leggere l'agenda
Elencare gli appuntamenti di un periodo e aprirne uno.
appointments:write
Toccare l'agenda
Creare un appuntamento, cambiarne lo stato e annullare.
catalog:read
Leggere il catalogo
Professionisti, prestazioni e gli orari liberi di una giornata.
patients:read
Leggere il paziente
Aprire l'anagrafica di base di un paziente che già conosci per identificativo. In questa versione non esiste una ricerca libera per nome.
Concedi il minimo. Un'integrazione che mostra soltanto l'agenda su uno schermo in sala non ha motivo di poter prenotare appuntamenti. E una chiave essenziale è un danno piccolo il giorno in cui esce.
Gli ambiti non si modificano dopo l'emissione. Allargarli vuol dire emettere una chiave nuova con quello che manca, sostituirla nel tuo ambiente e revocare la vecchia.
Ambiente di prova
La clinica riceve un ambiente di prova tutto suo, isolato dalla clinica vera. La prima chiave di prova emessa lo crea già, quindi non c'è niente da predisporre né da chiedere.
Cosa c'è già dentro
C'è un paziente, una prestazione e un professionista di esempio. Nessuno dei tre esiste nella clinica vera. Gli elenchi di professionisti e di prestazioni restituiscono gli identificativi di quei due, quindi consultare catalogo e orari liberi funziona già alla prima seduta. L'anagrafica è della clinica: dall'API, quello che si crea sono appuntamenti.
Cosa non si riesce a provare qui
L'API scrive in tre punti: creare un appuntamento, cambiarne la situazione e annullarlo. Oggi nessuno dei tre si riesce a esercitare qui, e il motivo arriva a catena. Creare ha bisogno dell'identificativo del paziente, che non compare a schermo né torna da nessuna consultazione, perché non c'è un elenco di pazienti. Cambiare la situazione e annullare hanno bisogno dell'identificativo di un appuntamento, ed esisterebbe solo se creare avesse funzionato: la lista degli appuntamenti qui nasce vuota. Chi deve provare la scrittura lo fa nella clinica vera, con la cura che questo richiede: prenota in un orario vuoto e annulla appena hai visto che ha funzionato.
Come riavviarlo
La scheda Ambiente de teste (Ambiente di prova) del pannello ha un pulsante che butta via l'ambiente attuale e ne consegna un altro, pulito, con gli stessi dati iniziali. Le chiavi di prova già emesse restano valide: sono legate alla clinica, non all'ambiente che è stato buttato via.
Riavviare cancella tutto quello che hai creato lì, e non c'è un annulla. È quello che vuoi quando una prova ha sporcato l'ambiente, ed è proprio quello che non vuoi in mezzo a una tornata di prove.
Riavviare è di chi ha Pode administrar nel pannello o amministra la clinica. Chi viene da fuori con quel ruolo riavvia da solo, senza dover chiedere a nessuno.
L'indirizzo dell'API
Ogni chiamata parte verso lo stesso indirizzo, ed è uno solo per tutti. Non esiste un indirizzo per clinica: a separare una clinica dall'altra è la chiave, mai l'URL.
https://wnricobmssysbwfhbmsm.supabase.co/functions/v1/api-v1Noterai un pezzo che sembra ripetuto a metà percorso. È giusto così. Uno è dell'infrastruttura che ospita l'API e l'altro è della versione della nostra. Copia l'indirizzo esattamente come compare qui; togliere la parte che sembra di troppo restituisce una risposta di indirizzo inesistente.
Prima chiamata, da zero alla prima risposta
Ci vogliono cinque minuti, contando dall'accesso. Fallo in modo di prova: se qualcosa esce diverso dall'atteso, a pagare è un paziente inventato.
- 1Emetti una chiave di provaSegui la strada descritta in Come ottenere una chiave, spuntando il modo di prova e l'ambito di lettura del catalogo. Copia la chiave.
- 2Metti la chiave in una variabile d'ambienteCosì la chiave non resta nella cronologia del terminale né incollata in mezzo al comando che stai per mandare a un collega.
- 3Chiedi l'elenco dei professionistiÈ la chiamata più semplice di qui: non riceve nessun parametro, e l'ambiente di prova arriva già con un professionista dentro. Se risponde, la tua chiave, il tuo ambito e il tuo indirizzo sono giusti in un colpo solo.
- 4Guarda cosa è tornatoUna risposta andata a buon fine porta il professionista di prova. Da lì in poi la ricetta è la stessa per tutto il resto: cambia l'indirizzo, l'intestazione resta uguale.
Sostituisci la chiave di esempio con la variabile in cui hai messo la tua al passo precedente, oppure con la chiave intera. Quella che compare qui è inventata, e torna rifiutata.
curl -X GET \
-H "Authorization: Bearer mv_live_a1b2c3d49f8e7d6c5b4a39281706f5e4d3c2b1a0" \
"https://wnricobmssysbwfhbmsm.supabase.co/functions/v1/api-v1/v1/practitioners"{
"data": [
{
"id": "1f6d5c84-3b92-4a07-8e15-d6c3f9b204ae",
"name": "Dra. Helena Costa",
"specialty": "Dermatologia"
}
]
}Se non è arrivato quello che ti aspettavi
Confronta quello che è tornato con il catalogo dei rifiuti di questa pagina, che dice cosa è successo e cosa fare in ogni caso. Vale la pena guardare anche la scheda Requisições (Richieste) del pannello, che mostra l'indirizzo chiamato, la risposta e l'orario di ogni chiamata ricevuta. Conserva solo quel riepilogo, mai il contenuto che hai mandato.
Il formato delle risposte
Le risposte arrivano incartate sempre allo stesso modo, e ogni chiamata mostra il formato di ciò che restituisce. Programma contro l'involucro e ignora quello che non conosci: col tempo compaiono informazioni nuove, e l'integrazione che ignora ciò che non si aspetta sopravvive a questo senza aver bisogno di te.
Gli involucri
- Un solo record, dentro l'involucro standard.
data - Un elenco, dentro lo stesso involucro.
data - Un elenco a pagine, accompagnato dal marcatore che chiede la successiva.
datanext_cursorPuò arrivare senza valore - Questa risposta esce dallo schema delle altre: porta il giorno consultato accanto agli orari.
dateslots - Il formato di ogni rifiuto, in qualunque chiamata.
error
Elenchi lunghi
Gli elenchi arrivano a pagine. La risposta porta un marcatore di continuazione: finché arriva pieno, manda quello stesso marcatore nella chiamata successiva per prendere la pagina dopo. Quando arriva senza valore, è finita. Non provare a indovinare il totale né a costruirti la paginazione per conto tuo.
Cosa porta ogni risposta
Appuntamento
| Campo | Tipo |
|---|---|
id | uuid |
status | string |
starts_at | datetime |
ends_atPuò arrivare senza valore | datetime |
patient_idPuò arrivare senza valore | uuid |
professional_idPuò arrivare senza valore | uuid |
procedure_ids | array<uuid> |
created_at | datetime |
Paziente
| Campo | Tipo |
|---|---|
id | uuid |
name | string |
phonePuò arrivare senza valore | string |
emailPuò arrivare senza valore | string |
Professionista
| Campo | Tipo |
|---|---|
id | uuid |
namePuò arrivare senza valore | string |
specialtyPuò arrivare senza valore | string |
Prestazione
| Campo | Tipo |
|---|---|
id | uuid |
name | string |
price | number |
duration_minutes | integer |
Orario libero
| Campo | Tipo |
|---|---|
time | string |
professional_id | uuid |
Rifiuto
| Campo | Tipo |
|---|---|
code | string |
message | string |
detailsNon arriva sempre | object |
Le chiamate
Ognuna porta quello che riceve, quello che restituisce e un esempio pronto da incollare nel terminale. Sostituisci gli identificativi dell'esempio con i tuoi.
MetodoGETIndirizzo/v1/appointments
Elenca gli appuntamenti di un periodo, a pagine.
- Ambito richiesto
appointments:readLeggere l'agenda- Ripetizione
- Non si applica
- Risposta
- Appuntamento
datanext_cursorPuò arrivare senza valore
| Parametro | Tipo | Dove va |
|---|---|---|
fromFacoltativo
| date | query |
toFacoltativo
| date | query |
statusFacoltativo
| string | query |
professional_idFacoltativo | uuid | query |
limitFacoltativo
| integer | query |
cursorFacoltativo
| string | query |
curl -X GET \
-H "Authorization: Bearer mv_live_a1b2c3d49f8e7d6c5b4a39281706f5e4d3c2b1a0" \
"https://wnricobmssysbwfhbmsm.supabase.co/functions/v1/api-v1/v1/appointments?from=2026-10-01&to=2026-10-31&limit=2"{
"data": [
{
"id": "9c1f4b2a-7e83-4d61-b0a5-2f8c6d31e4a7",
"status": "agendado",
"starts_at": "2026-10-03T14:30:00",
"ends_at": "2026-10-03T15:30:00",
"patient_id": "4d7e2c19-5a6b-4f30-9e81-c2a5b7d04f63",
"professional_id": "1f6d5c84-3b92-4a07-8e15-d6c3f9b204ae",
"procedure_ids": [
"2a9f8b31-6c74-4e05-9d28-a3f1e7b5c06d"
],
"created_at": "2026-09-28T11:04:22.517Z"
},
{
"id": "5e0b7a94-1d62-4c38-97af-8b41d2e6c03f",
"status": "confirmado",
"starts_at": "2026-10-03T16:00:00",
"ends_at": "2026-10-03T16:45:00",
"patient_id": "4d7e2c19-5a6b-4f30-9e81-c2a5b7d04f63",
"professional_id": "1f6d5c84-3b92-4a07-8e15-d6c3f9b204ae",
"procedure_ids": [
"2a9f8b31-6c74-4e05-9d28-a3f1e7b5c06d"
],
"created_at": "2026-09-28T11:04:22.517Z"
}
],
"next_cursor": "MjAyNi0xMC0wM3wxNDozMDowMHw5YzFmNGIyYS03ZTgzLTRkNjEtYjBhNS0yZjhjNmQzMWU0YTc="
}curl -X GET \
-H "Authorization: Bearer mv_live_a1b2c3d49f8e7d6c5b4a39281706f5e4d3c2b1a0" \
"https://wnricobmssysbwfhbmsm.supabase.co/functions/v1/api-v1/v1/appointments?from=2026-10-01&to=2026-10-31&limit=2&cursor=MjAyNi0xMC0wM3wxNDozMDowMHw5YzFmNGIyYS03ZTgzLTRkNjEtYjBhNS0yZjhjNmQzMWU0YTc%3D"{
"data": [],
"next_cursor": null
}MetodoPOSTIndirizzo/v1/appointments
Prenota un appuntamento per un paziente, con un professionista, a un orario.
- Ambito richiesto
appointments:writeToccare l'agenda- Ripetizione
- Richiede il valore di ripetizione
- Risposta
- Appuntamento
data
| Parametro | Tipo | Dove va |
|---|---|---|
Idempotency-KeyObbligatorio | string | header |
patient_idObbligatorio | uuid | body |
professional_idObbligatorio | uuid | body |
procedure_idsObbligatorio
| array<uuid> | body |
starts_atObbligatorio
| datetime | body |
statusFacoltativo
| string | body |
curl -X POST \
-H "Authorization: Bearer mv_live_a1b2c3d49f8e7d6c5b4a39281706f5e4d3c2b1a0" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 7f3c05a1-9b24-4e6d-8c17-0a5f3d92b4e8" \
-d '{
"patient_id": "4d7e2c19-5a6b-4f30-9e81-c2a5b7d04f63",
"professional_id": "1f6d5c84-3b92-4a07-8e15-d6c3f9b204ae",
"procedure_ids": [
"2a9f8b31-6c74-4e05-9d28-a3f1e7b5c06d"
],
"starts_at": "2026-10-03T14:30:00",
"status": "agendado"
}' \
"https://wnricobmssysbwfhbmsm.supabase.co/functions/v1/api-v1/v1/appointments"{
"data": {
"id": "9c1f4b2a-7e83-4d61-b0a5-2f8c6d31e4a7",
"status": "agendado",
"starts_at": "2026-10-03T14:30:00",
"ends_at": "2026-10-03T15:30:00",
"patient_id": "4d7e2c19-5a6b-4f30-9e81-c2a5b7d04f63",
"professional_id": "1f6d5c84-3b92-4a07-8e15-d6c3f9b204ae",
"procedure_ids": [
"2a9f8b31-6c74-4e05-9d28-a3f1e7b5c06d"
],
"created_at": "2026-09-28T11:04:22.517Z"
}
}curl -X POST \
-H "Authorization: Bearer mv_live_a1b2c3d49f8e7d6c5b4a39281706f5e4d3c2b1a0" \
-H "Content-Type: application/json" \
-d '{
"patient_id": "4d7e2c19-5a6b-4f30-9e81-c2a5b7d04f63",
"professional_id": "1f6d5c84-3b92-4a07-8e15-d6c3f9b204ae",
"procedure_ids": [
"2a9f8b31-6c74-4e05-9d28-a3f1e7b5c06d"
],
"starts_at": "2026-10-03T14:30:00"
}' \
"https://wnricobmssysbwfhbmsm.supabase.co/functions/v1/api-v1/v1/appointments"{
"error": {
"code": "validation_failed",
"message": "Cabeçalho Idempotency-Key é obrigatório para criar agendamento."
}
}MetodoGETIndirizzo/v1/appointments/{id}
Apre un appuntamento preciso.
- Ambito richiesto
appointments:readLeggere l'agenda- Ripetizione
- Non si applica
- Risposta
- Appuntamento
data
| Parametro | Tipo | Dove va |
|---|---|---|
idObbligatorio | uuid | path |
curl -X GET \
-H "Authorization: Bearer mv_live_a1b2c3d49f8e7d6c5b4a39281706f5e4d3c2b1a0" \
"https://wnricobmssysbwfhbmsm.supabase.co/functions/v1/api-v1/v1/appointments/9c1f4b2a-7e83-4d61-b0a5-2f8c6d31e4a7"{
"data": {
"id": "9c1f4b2a-7e83-4d61-b0a5-2f8c6d31e4a7",
"status": "agendado",
"starts_at": "2026-10-03T14:30:00",
"ends_at": "2026-10-03T15:30:00",
"patient_id": "4d7e2c19-5a6b-4f30-9e81-c2a5b7d04f63",
"professional_id": "1f6d5c84-3b92-4a07-8e15-d6c3f9b204ae",
"procedure_ids": [
"2a9f8b31-6c74-4e05-9d28-a3f1e7b5c06d"
],
"created_at": "2026-09-28T11:04:22.517Z"
}
}MetodoPATCHIndirizzo/v1/appointments/{id}/status
Cambia lo stato di un appuntamento, entro quanto è permesso.
- Ambito richiesto
appointments:writeToccare l'agenda- Ripetizione
- Sicuro ripeterla
- Risposta
- Appuntamento
data
| Parametro | Tipo | Dove va |
|---|---|---|
idObbligatorio | uuid | path |
statusObbligatorio
| string | body |
curl -X PATCH \
-H "Authorization: Bearer mv_live_a1b2c3d49f8e7d6c5b4a39281706f5e4d3c2b1a0" \
-H "Content-Type: application/json" \
-d '{
"status": "confirmado"
}' \
"https://wnricobmssysbwfhbmsm.supabase.co/functions/v1/api-v1/v1/appointments/9c1f4b2a-7e83-4d61-b0a5-2f8c6d31e4a7/status"{
"data": {
"id": "9c1f4b2a-7e83-4d61-b0a5-2f8c6d31e4a7",
"status": "confirmado",
"starts_at": "2026-10-03T14:30:00",
"ends_at": "2026-10-03T15:30:00",
"patient_id": "4d7e2c19-5a6b-4f30-9e81-c2a5b7d04f63",
"professional_id": "1f6d5c84-3b92-4a07-8e15-d6c3f9b204ae",
"procedure_ids": [
"2a9f8b31-6c74-4e05-9d28-a3f1e7b5c06d"
],
"created_at": "2026-09-28T11:04:22.517Z"
}
}curl -X PATCH \
-H "Authorization: Bearer mv_live_a1b2c3d49f8e7d6c5b4a39281706f5e4d3c2b1a0" \
-H "Content-Type: application/json" \
-d '{
"status": "realizado"
}' \
"https://wnricobmssysbwfhbmsm.supabase.co/functions/v1/api-v1/v1/appointments/9c1f4b2a-7e83-4d61-b0a5-2f8c6d31e4a7/status"{
"error": {
"code": "status_transition_not_allowed",
"message": "Transição de status não permitida por esta API.",
"details": {
"from": "agendado",
"to": "realizado"
}
}
}MetodoPOSTIndirizzo/v1/appointments/{id}/cancel
Annulla un appuntamento.
- Ambito richiesto
appointments:writeToccare l'agenda- Ripetizione
- Sicuro ripeterla
- Risposta
- Appuntamento
data
| Parametro | Tipo | Dove va |
|---|---|---|
idObbligatorio | uuid | path |
curl -X POST \
-H "Authorization: Bearer mv_live_a1b2c3d49f8e7d6c5b4a39281706f5e4d3c2b1a0" \
"https://wnricobmssysbwfhbmsm.supabase.co/functions/v1/api-v1/v1/appointments/9c1f4b2a-7e83-4d61-b0a5-2f8c6d31e4a7/cancel"{
"data": {
"id": "9c1f4b2a-7e83-4d61-b0a5-2f8c6d31e4a7",
"status": "cancelado",
"starts_at": "2026-10-03T14:30:00",
"ends_at": "2026-10-03T15:30:00",
"patient_id": "4d7e2c19-5a6b-4f30-9e81-c2a5b7d04f63",
"professional_id": "1f6d5c84-3b92-4a07-8e15-d6c3f9b204ae",
"procedure_ids": [
"2a9f8b31-6c74-4e05-9d28-a3f1e7b5c06d"
],
"created_at": "2026-09-28T11:04:22.517Z"
}
}MetodoGETIndirizzo/v1/patients/{id}
Apre l'anagrafica di base di un paziente.
- Ambito richiesto
patients:readLeggere il paziente- Ripetizione
- Non si applica
- Risposta
- Paziente
data
| Parametro | Tipo | Dove va |
|---|---|---|
idObbligatorio | uuid | path |
curl -X GET \
-H "Authorization: Bearer mv_live_a1b2c3d49f8e7d6c5b4a39281706f5e4d3c2b1a0" \
"https://wnricobmssysbwfhbmsm.supabase.co/functions/v1/api-v1/v1/patients/4d7e2c19-5a6b-4f30-9e81-c2a5b7d04f63"{
"data": {
"id": "4d7e2c19-5a6b-4f30-9e81-c2a5b7d04f63",
"name": "Ana Ribeiro",
"phone": "+5511987654321",
"email": "ana.ribeiro@example.com"
}
}MetodoGETIndirizzo/v1/practitioners
Elenca i professionisti della clinica.
- Ambito richiesto
catalog:readLeggere il catalogo- Ripetizione
- Non si applica
- Risposta
- Professionista
data
Questa chiamata non riceve parametri.
curl -X GET \
-H "Authorization: Bearer mv_live_a1b2c3d49f8e7d6c5b4a39281706f5e4d3c2b1a0" \
"https://wnricobmssysbwfhbmsm.supabase.co/functions/v1/api-v1/v1/practitioners"{
"data": [
{
"id": "1f6d5c84-3b92-4a07-8e15-d6c3f9b204ae",
"name": "Dra. Helena Costa",
"specialty": "Dermatologia"
}
]
}MetodoGETIndirizzo/v1/procedures
Elenca le prestazioni del catalogo.
- Ambito richiesto
catalog:readLeggere il catalogo- Ripetizione
- Non si applica
- Risposta
- Prestazione
data
Questa chiamata non riceve parametri.
curl -X GET \
-H "Authorization: Bearer mv_live_a1b2c3d49f8e7d6c5b4a39281706f5e4d3c2b1a0" \
"https://wnricobmssysbwfhbmsm.supabase.co/functions/v1/api-v1/v1/procedures"{
"data": [
{
"id": "2a9f8b31-6c74-4e05-9d28-a3f1e7b5c06d",
"name": "Limpeza de pele profunda",
"price": 280,
"duration_minutes": 60
}
]
}MetodoGETIndirizzo/v1/availability
Mostra gli orari liberi di una giornata, e si può restringere a un professionista o a una prestazione.
- Ambito richiesto
catalog:readLeggere il catalogo- Ripetizione
- Non si applica
- Risposta
- Orario libero
dateslots
| Parametro | Tipo | Dove va |
|---|---|---|
dateObbligatorio
| date | query |
professional_idFacoltativo | uuid | query |
procedure_idFacoltativo | uuid | query |
curl -X GET \
-H "Authorization: Bearer mv_live_a1b2c3d49f8e7d6c5b4a39281706f5e4d3c2b1a0" \
"https://wnricobmssysbwfhbmsm.supabase.co/functions/v1/api-v1/v1/availability?date=2026-10-03&procedure_id=2a9f8b31-6c74-4e05-9d28-a3f1e7b5c06d"{
"date": "2026-10-03",
"slots": [
{
"time": "09:00",
"professional_id": "1f6d5c84-3b92-4a07-8e15-d6c3f9b204ae"
},
{
"time": "10:00",
"professional_id": "1f6d5c84-3b92-4a07-8e15-d6c3f9b204ae"
}
]
}Ripetere senza duplicare
La rete cade in mezzo alla chiamata, il tempo scade, e tu resti senza sapere se l'appuntamento è stato creato. Ripetere per conto tuo può prenotare lo stesso paziente due volte.
Per questo ogni creazione viaggia con un valore di ripetizione inventato da te, uno per ogni operazione. Se arriva di nuovo con lo stesso contenuto, Meevia restituisce la risposta che aveva già dato, senza elaborare una seconda volta.
Idempotency-Key
Come scegliere quel valore
Genera un valore unico per operazione (un identificativo casuale va benissimo) e conservalo insieme al tuo tentativo, così da riusare esattamente lo stesso al momento di ripetere. Generarne uno nuovo a ogni tentativo equivale a non avere nessuna protezione.
La risposta conservata torna com'era, anche quando era un rifiuto. Ripetere con il valore di un tentativo andato male restituisce lo stesso errore, non un tentativo nuovo.
Riusare lo stesso valore con contenuto diverso viene rifiutato, e quel rifiuto di solito smaschera due operazioni distinte che condividono un unico valore. La stessa risposta compare quando una chiamata gemella è ancora in corso, e lì aspettare qualche istante e ripetere risolve.
Il valore vale un giorno. Dopo viene dimenticato, e una ripetizione torna a essere elaborata davvero.
Un tentativo rimasto senza risposta viene dato per perso dopo pochi minuti, e la chiamata successiva con quel valore ne prende il posto. Così una richiesta morta a metà non ti blocca fino al giorno dopo.
- Minuti di attesa prima di ripetere un tentativo senza risposta
5
Cosa succede ripetendo ogni chiamata
Non si applica
È una lettura, e una lettura non cambia niente se ripetuta.
Richiede il valore di ripetizione
Senza, la chiamata viene rifiutata. È la protezione contro il prenotare lo stesso paziente due volte quando la rete cade a metà.
Sicuro ripeterla
Ripetere porta allo stesso posto: chiedere lo stato in cui l'appuntamento già si trova restituisce l'appuntamento com'è. Qui non serve mandare un valore di ripetizione.
Limiti d'uso
Ogni chiave ha un tetto suo di chiamate al minuto. È per chiave e non per clinica. Due integrazioni nella stessa clinica non si contendono lo stesso limite, e quella che ha sparato troppe chiamate non fa cadere l'altra.
- Chiamate al minuto, su ogni chiave
120
Il conteggio si azzera allo scoccare di ogni minuto dell'orologio, e non su una finestra che scorre. In pratica, due raffiche lanciate a cavallo dello scoccare cadono in minuti diversi, quindi un picco breve può passare anche sommando più del tetto. Non è margine su cui si possa contare: quello che regge un'integrazione è il ritmo medio.
Quando sfori, la risposta porta in un'intestazione dedicata, e non nel corpo, quanti secondi aspettare. Rispetta quel numero invece di riprovare subito. Se diventa abitudine, il problema non è il tetto: distanzia le chiamate, tieni da parte quello che cambia poco (il catalogo cambia poco) ed evita di chiedere in continuazione.
Retry-After
Cambi di stato permessi
L'API accetta un insieme chiuso di cambi, e la tabella mostra quali: ogni stato di partenza ha le destinazioni che permette, e ciò che non è in tabella viene rifiutato. Segnare l'appuntamento come svolto e registrare un'assenza restano fuori per decisione di prodotto. Entrambi generano vendita, addebito e consumo di una seduta del pacchetto. Restano in mano a chi manda avanti la clinica.
| Stato attuale | Può passare a |
|---|---|
pre_agendado | agendadoconfirmadocancelado |
agendado | confirmadocancelado |
confirmado | cancelado |
em_espera | cancelado |
Gli stati
pre_agendado- Prenotato, ma ancora senza conferma di nessuno. È lo stato in cui nasce un appuntamento nuovo quando non ne chiedi un altro.
agendado- È in agenda e la clinica ci conta.
confirmado- Il paziente ha confermato che viene. È quello che la reception guarda per sapere su cosa contare quel giorno.
em_espera- È in coda, in attesa che si liberi un posto. L'API non mette nessuno qui, ma legge chi c'è, e da qui l'unico cambio possibile è annullare.
cancelado- Annullato, e punto: da qui l'API non cambia più niente.
realizado- La visita è avvenuta. A registrarlo è la clinica, perché il cambio genera la vendita. L'API lo legge e non lo scrive.
faltou- Il paziente non si è presentato. Anche questo è della clinica: entra nell'addebito per mancata presenza e nel consumo di una seduta del pacchetto. L'API lo legge e non lo scrive.
Quando la chiamata non va a buon fine
Ogni rifiuto torna nello stesso formato, con un codice breve che non cambia e un messaggio in portoghese. Nel tuo programma decidi sempre in base al codice, mai in base al messaggio: il messaggio esiste per il tuo log e può essere riscritto in qualunque momento.
Alcuni rifiuti portano anche il dettaglio di ciò che non è passato. Non tutti lo portano, quindi il tuo codice non può dipenderne.
plan_requiredCodice di stato 403
La chiave è valida, ma il piano della clinica non comprende l'accesso all'API.
Nessuna modifica al tuo codice lo risolve. Avvisa la clinica, che parla con l'assistenza di Meevia: è questione di piano.
scope_requiredCodice di stato 403
La chiave è valida, ma non ha l'ambito che questa chiamata richiede.
Guarda nel riquadro della chiamata quale ambito chiede, e confrontalo con gli ambiti della chiave nella scheda Chaves del pannello. Gli ambiti non si modificano: emetti un'altra chiave con quello che manca, sostituiscila nel tuo ambiente e revoca la vecchia.
not_foundCodice di stato 404
Qui arrivano due situazioni diverse: o l'indirizzo non corrisponde a niente, o quello che hai chiesto non esiste in questa clinica.
Controlla prima l'indirizzo, lettera per lettera, contro l'esempio della chiamata; un plurale di troppo finisce in questo caso. Se l'indirizzo è giusto, quello che manca è il record: può essere stato cancellato, oppure essere di un'altra clinica. Ricorda anche che l'ambiente di prova ha dati suoi. Un identificativo copiato dalla clinica vera lì dentro non esiste.
method_not_allowedCodice di stato 405
L'indirizzo esiste, ma non risponde a quel tipo di richiesta.
Controlla nel riquadro della chiamata quale metodo si aspetta. Quasi sempre è una lettura tentata come scrittura, o il contrario.
validation_failedCodice di stato 422
Qualcosa in ciò che hai mandato non ha passato il controllo: manca un dato obbligatorio, oppure uno è arrivato in un formato che non va.
Il messaggio del rifiuto dice cosa non è passato. Confrontalo con la tabella dei parametri della chiamata, con attenzione particolare al formato di data e ora, che è dove si sbaglia di più.
rate_limitedCodice di stato 429
Hai superato il tetto di chiamate al minuto di quella chiave.
Aspetta i secondi che arrivano nell'intestazione di attesa della risposta. Non sono nel corpo. È per questo che in tanti non trovano il numero e finiscono per riprovare subito, il che non fa che affondare di più. Se capita spesso, aggiusta il ritmo: distanzia le chiamate, tieni da parte quello che cambia poco e non chiedere in continuazione.
idempotency_conflictCodice di stato 409
Il valore di ripetizione che hai mandato è già stato usato per altro, oppure una chiamata gemella è ancora in corso.
Se era per altro, passa a generare un valore nuovo per ogni operazione nuova; riusare lo stesso su operazioni diverse è quello che causa questo. Se è la gemella, aspetta qualche istante e ripeti con lo stesso valore: appena la prima finisce, viene restituita la risposta conservata.
status_transition_not_allowedCodice di stato 422
Il cambio che hai chiesto non è permesso a partire dallo stato in cui si trova l'appuntamento.
Leggi la tabella dei cambi permessi, che mostra dove si può andare da ogni stato. Segnare come svolto e registrare un'assenza non ci sono, e restano dell'operatività della clinica. Il rifiuto arriva con lo stato attuale e quello chiesto, il che di solito rivela che l'appuntamento si era già spostato altrove.
sandbox_not_readyCodice di stato 409
La chiave è di prova e l'ambiente di prova della clinica non è ancora in piedi.
Riprova tra qualche istante. Se persiste, l'ambiente va riavviato, cosa che lo ricrea da zero, e lo fai tu stesso se hai Pode administrar nel pannello. Una chiave di produzione non finisce mai in questo caso.
internal_errorCodice di stato 500
Qualcosa si è rotto dalla nostra parte.
Non è il tuo codice. Riprova dopo un intervallo. Se persiste, parla con l'assistenza di Meevia dicendo l'orario e che cosa hai chiamato; la scheda Requisições del pannello aiuta a individuarlo.
Ti serve una mano
Raccontaci che cosa hai chiamato, che cosa ti aspettavi e che cosa è tornato. La scheda Requisições del pannello mostra quello che è arrivato fino a noi, ed è da lì che cominciamo a guardare.
Questa pagina e l'API
Se trovi una differenza tra quello che è scritto qui e quello che l'API ha risposto, ha ragione l'API, e noi vogliamo saperlo. La data qui sotto dice quando questa pagina è stata verificata contro di essa l'ultima volta.