Integración
Eventos
Una sola puerta para que su sistema le avise a Kuida lo que pasó: un turno nuevo, una consulta atendida, un pedido de servicio. Mismo sobre para todos los tipos.
POST /v1/events hace lo mismo que los recursos (/v1/visits, /v1/appointments, …) con un formato común. Conviene cuando su sistema ya emite eventos, cuando hay que cargar mucho de una vez o cuando es más simple tener un único punto de salida hacia Kuida.
curl https://www.kuida.ar/api/v1/events \
-H "Authorization: Bearer kd_test_…" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"id": "turno-123-atendido",
"type": "visit.completed",
"occurredAt": "2026-10-05T10:45:00-03:00",
"source": {
"system": "mi-sistema",
"version": "3.2"
},
"data": {
"patient": {
"phone": "+54 9 342 555 0000",
"fullName": "Paciente Demo",
"dni": "11111111"
},
"visit": {
"visitedAt": "2026-10-05T10:45:00-03:00",
"externalId": "turno-123"
}
}
}'El sobre
idstringobligatorioSu id del evento. Es la clave de idempotencia: reenviar el mismo id no repite nada.
schemaVersionnumberVersión del esquema del evento. Siempre 1 en v1.
Default:
1occurredAttimestampCuándo pasó. Default: ahora.
sourceobjetoQué sistema lo emite, para el registro.
› Ver 2 camposOcultar campos
systemstringversionstring
typeenumobligatorioTipo de evento. Define la forma de
data.Valores:
intake.requestedpatient.upsertedappointment.createdappointment.rescheduledappointment.cancelledvisit.completedtreatment.prescribedorder.issueddataobjetoobligatorioSu forma depende de
type: ver el catálogo de eventos.
El id lo asigna su sistema y es la clave de idempotencia del evento: reenviar el mismo id no repite nada. Use un valor derivado del hecho, como turno-123-atendido, para que un reenvío desde otra parte de su sistema también se reconozca.
Lotes
El cuerpo puede ser un evento, un array de hasta 100 o un objeto { events: [...] }. Cada evento se valida y procesa por separado: uno inválido no impide que se procesen los demás.
curl https://www.kuida.ar/api/v1/events \
-H "Authorization: Bearer kd_test_…" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"events": [
{
"id": "paciente-HC-1234",
"type": "patient.upserted",
"data": {
"phone": "+54 9 342 555 0000",
"fullName": "Paciente Demo",
"externalId": "HC-1234"
}
},
{
"id": "turno-123-creado",
"type": "appointment.created",
"data": {
"externalId": "turno-123",
"startAt": "2026-10-05T10:30:00-03:00",
"patient": {
"phone": "+54 9 342 555 0000"
}
}
}
]
}'La respuesta
Un resultado por evento, en el mismo orden en que se enviaron. El status HTTP es 200 si se aceptó al menos uno y 400 si todos fallaron por esquema.
{
"object": "event_batch",
"results": [
{
"id": "turno-123-atendido",
"accepted": true,
"status": "processed",
"event": "evt_cm1a2b3c4d5e6f7g8h9i0j",
"result": {
"object": "visit",
"id": "vis_cm1a2b3c4d5e6f7g8h9i0j"
},
"error": null
}
]
}objectstringresultsarray de objetos› Ver 6 camposOcultar campos
idstringEl id que envió.
acceptedbooleanstatusenumValores:
processedduplicateunhandledinvalidfailedeventstringpuede ser nullId del evento en Kuida (
evt_…).resultobjetopuede ser null› Ver 2 camposOcultar campos
objectstringidstring
errorstringpuede ser null
processed- SignificadoKuida lo procesó.
resultindica el objeto que produjo ({ object: "visit", id: "vis_…" }). duplicate- SignificadoYa había llegado un evento con ese
id. No se repite nada;resultapunta al objeto original. unhandled- SignificadoSe guardó, pero ese tipo todavía no tiene efecto en Kuida. Reenviarlo con el mismo
idrespondeduplicate. invalid- SignificadoNo cumple el esquema.
errorindica qué campo falló. No se guardó: se puede corregir y reenviar. failed- SignificadoFalló el procesamiento. Reenviar con el mismo
idlo vuelve a procesar.
Catálogo
Tipos de evento de la versión vigente y lo que hace Kuida con cada uno. Los que figuran como “recibido, todavía sin efecto” se aceptan y quedan registrados con status unhandled; se pueden enviar desde ya.
intake.requestedProcesado
Alguien pide el servicio para un paciente. Abre una solicitud de ingreso; Kuida completa por WhatsApp los datos que falten.
{
"id": "ejemplo-intake-requested",
"type": "intake.requested",
"data": {
"patient": {
"fullName": "Paciente Demo",
"dni": "11111111"
},
"contacts": [
{
"name": "Familiar Demo",
"relationship": "hija",
"phone": "+54 9 342 555 0001"
}
],
"coverage": {
"insurer": "OSDEMO",
"memberId": "000123"
},
"requestedService": "Internación domiciliaria",
"flags": {
"hospitalized": true
}
}
}› Campos de data
patientobjeto› Ver 6 camposOcultar campos
phonestringpuede ser nulldnistringpuede ser nullexternalIdstringpuede ser nullfullNamestringpuede ser nullemailstringpuede ser nulldateOfBirthtimestamppuede ser null
contactsarray de objetosDefault:
[]› Ver 4 camposOcultar campos
namestringpuede ser nullrelationshipstringpuede ser nullphonestringpuede ser nullemailstringpuede ser null
coverageobjeto› Ver 3 camposOcultar campos
insurerstringpuede ser nullplanstringpuede ser nullmemberIdstringpuede ser null
addressstringpuede ser nullrequestedServicestringpuede ser nullsenderobjeto› Ver 3 camposOcultar campos
namestringpuede ser nullemailstringpuede ser nullorganizationstringpuede ser null
attachmentsarray de objetosDefault:
[]› Ver 4 camposOcultar campos
namestringobligatoriomimeTypestringpuede ser nullkindenumValores:
PEDIDO_MEDICOHISTORIA_CLINICACOBERTURAOTROrefstringpuede ser null
summarystringpuede ser nullflagsobjeto› Ver 1 camposOcultar campos
hospitalizedboolean
originobjeto› Ver 6 camposOcultar campos
channelenumValores:
EMAILFORMMANUALAPIthreadIdstringpuede ser nullmessageIdstringpuede ser nullfromstringpuede ser nullsubjectstringpuede ser nullreceivedAttimestamppuede ser null
patient.upsertedProcesado
Alta o actualización de un paciente. Kuida lo busca por teléfono, DNI o id externo y, si no existe, lo crea.
{
"id": "ejemplo-patient-upserted",
"type": "patient.upserted",
"data": {
"phone": "+54 9 342 555 0000",
"fullName": "Paciente Demo",
"dni": "11111111",
"externalId": "HC-1234"
}
}› Campos de data
phonestringpuede ser nulldnistringpuede ser nullexternalIdstringpuede ser nullfullNamestringpuede ser nullemailstringpuede ser nulldateOfBirthtimestamppuede ser null
appointment.createdProcesado
Un turno nuevo. Kuida agenda los recordatorios por WhatsApp que tiene configurados la organización. Sin externalId, el turno solo se puede cambiar por la API con su id de Kuida.
{
"id": "ejemplo-appointment-created",
"type": "appointment.created",
"data": {
"externalId": "turno-123",
"startAt": "2026-10-05T10:30:00-03:00",
"visitType": "Control",
"patient": {
"phone": "+54 9 342 555 0000",
"fullName": "Paciente Demo"
},
"doctor": {
"externalId": "MED-12",
"fullName": "Dra. Demo"
}
}
}› Campos de data
externalIdstringpuede ser nullbookingExternalIdstringpuede ser nullstartAttimestampobligatoriovisitTypestringpuede ser nullpatientobjetoobligatorio› Ver 6 camposOcultar campos
phonestringpuede ser nulldnistringpuede ser nullexternalIdstringpuede ser nullfullNamestringpuede ser nullemailstringpuede ser nulldateOfBirthtimestamppuede ser null
doctorobjeto› Ver 3 camposOcultar campos
fullNamestringpuede ser nullspecialtystringpuede ser nullexternalIdstringpuede ser null
appointment.rescheduledProcesado
Cambio de horario de un turno, identificado por su externalId. Reprograma los recordatorios.
{
"id": "ejemplo-appointment-rescheduled",
"type": "appointment.rescheduled",
"data": {
"externalId": "turno-123",
"startAt": "2026-10-06T11:00:00-03:00",
"patient": {
"phone": "+54 9 342 555 0000"
},
"reason": "Pedido del paciente"
}
}› Campos de data
externalIdstringobligatoriobookingExternalIdstringpuede ser nullstartAttimestampobligatoriovisitTypestringpuede ser nullpatientobjetoobligatorio› Ver 6 camposOcultar campos
phonestringpuede ser nulldnistringpuede ser nullexternalIdstringpuede ser nullfullNamestringpuede ser nullemailstringpuede ser nulldateOfBirthtimestamppuede ser null
doctorobjeto› Ver 3 camposOcultar campos
fullNamestringpuede ser nullspecialtystringpuede ser nullexternalIdstringpuede ser null
reasonstringpuede ser null
appointment.cancelledProcesado
Cancelación de un turno, identificado por su externalId. Da de baja los recordatorios pendientes.
{
"id": "ejemplo-appointment-cancelled",
"type": "appointment.cancelled",
"data": {
"externalId": "turno-123",
"startAt": "2026-10-05T10:30:00-03:00",
"patient": {
"phone": "+54 9 342 555 0000"
},
"reason": "El paciente avisó que no puede asistir"
}
}› Campos de data
externalIdstringobligatoriobookingExternalIdstringpuede ser nullstartAttimestampobligatoriovisitTypestringpuede ser nullpatientobjetoobligatorio› Ver 6 camposOcultar campos
phonestringpuede ser nulldnistringpuede ser nullexternalIdstringpuede ser nullfullNamestringpuede ser nullemailstringpuede ser nulldateOfBirthtimestamppuede ser null
doctorobjeto› Ver 3 camposOcultar campos
fullNamestringpuede ser nullspecialtystringpuede ser nullexternalIdstringpuede ser null
reasonstringpuede ser null
visit.completedProcesado
Una consulta atendida. Arranca el seguimiento posconsulta del paciente por WhatsApp.
{
"id": "ejemplo-visit-completed",
"type": "visit.completed",
"data": {
"patient": {
"phone": "+54 9 342 555 0000",
"fullName": "Paciente Demo",
"dni": "11111111"
},
"doctor": {
"externalId": "MED-12",
"fullName": "Dra. Demo"
},
"visit": {
"visitedAt": "2026-10-05T10:45:00-03:00",
"type": "Control",
"externalId": "turno-123"
}
}
}› Campos de data
patientobjetoobligatorio› Ver 6 camposOcultar campos
phonestringpuede ser nulldnistringpuede ser nullexternalIdstringpuede ser nullfullNamestringpuede ser nullemailstringpuede ser nulldateOfBirthtimestamppuede ser null
doctorobjeto› Ver 3 camposOcultar campos
fullNamestringpuede ser nullspecialtystringpuede ser nullexternalIdstringpuede ser null
visitobjetoobligatorio› Ver 7 camposOcultar campos
visitedAttimestampobligatoriotypestringpuede ser nulldiagnosisstringpuede ser nullnotesstringpuede ser nullrecommendedFollowUpsarray de anypuede ser nullexternalIdstringpuede ser nullbookingExternalIdstringpuede ser null
rawany
treatment.prescribedProcesado
Un tratamiento indicado al paciente. Queda registrado en su ficha; Kuida no envía recordatorios de toma de medicación.
{
"id": "ejemplo-treatment-prescribed",
"type": "treatment.prescribed",
"data": {
"patient": {
"phone": "+54 9 342 555 0000"
},
"name": "Enalapril 10 mg",
"kind": "MEDICATION",
"frequency": "cada 12 horas",
"startAt": "2026-10-05T00:00:00-03:00"
}
}› Campos de data
patientobjetoobligatorio› Ver 6 camposOcultar campos
phonestringpuede ser nulldnistringpuede ser nullexternalIdstringpuede ser nullfullNamestringpuede ser nullemailstringpuede ser nulldateOfBirthtimestamppuede ser null
namestringobligatoriokindenumValores:
MEDICATIONTHERAPYDIETSTUDYLABWORKLIFESTYLEdosagestringpuede ser nullinstructionsstringpuede ser nullfrequencystringpuede ser nullstartAttimestamppuede ser nullendAttimestamppuede ser nullprescribedByobjeto› Ver 3 camposOcultar campos
fullNamestringpuede ser nullspecialtystringpuede ser nullexternalIdstringpuede ser null
order.issuedRecibido, todavía sin efecto
Una orden emitida para el paciente: laboratorio, imágenes, interconsulta u otra.
{
"id": "ejemplo-order-issued",
"type": "order.issued",
"data": {
"patient": {
"phone": "+54 9 342 555 0000"
},
"kind": "LAB",
"description": "Hemograma completo",
"issuedAt": "2026-10-05T10:45:00-03:00"
}
}› Campos de data
patientobjetoobligatorio› Ver 6 camposOcultar campos
phonestringpuede ser nulldnistringpuede ser nullexternalIdstringpuede ser nullfullNamestringpuede ser nullemailstringpuede ser nulldateOfBirthtimestamppuede ser null
kindenumobligatorioValores:
LABIMAGINGCONSULTOTHERdescriptionstringobligatorioissuedAttimestamppuede ser nullissuedByobjeto› Ver 3 camposOcultar campos
fullNamestringpuede ser nullspecialtystringpuede ser nullexternalIdstringpuede ser null
Depurar una integración
Todo lo que entra a Kuida para la organización queda en GET /v1/events, con su estado y el error si lo hubo. Para ver lo que falló:
curl -G https://www.kuida.ar/api/v1/events \
-H "Authorization: Bearer kd_test_…" \
-d status=failed \
-d limit=10Webhooks de eventos procesados
Cuando Kuida procesa un evento, avisa a los endpoints de webhook suscriptos a ese tipo. Ver Webhooks.