Acceso API
Si su clínica ya usa otro sistema —de gestión, de facturación, o una hoja de cálculo— puede conectarlo con Pingclínica en vez de copiar datos a mano.
Con una clave API su sistema puede:
- leer las citas para mostrarlas en su propia agenda o en un reporte;
- importar y mantener al día su lista de pacientes y doctores.
Se configura en Configuración → Acceso API.
El cuestionario de salud nunca se entrega por esta vía. Es el único dato clínico que guarda Pingclínica y no está disponible con una clave API, sin importar los permisos que le dé.
Crear una clave
- Entre a Configuración → Acceso API y toque Nueva clave.
- Póngale un nombre que reconozca después (ej. «Sistema de gestión»).
- Marque solo los permisos que ese sistema necesita.
- Opcionalmente, fije una fecha de vencimiento.
Al crearla verá la clave una sola vez. Guárdela en ese momento: no volvemos a mostrarla. Si la pierde, cree una nueva y elimine la anterior.
Una clave se ve así:
pc_x7Kd9mQr2vBnL4pTz8wYcH3jF6sA1eR5uN0iO
Trátela como una contraseña. Debe vivir en su servidor, nunca en el navegador ni en una app móvil: cualquiera que la vea puede leer los datos de su clínica.
Permisos
Cada clave lleva solo los permisos que usted marque.
| Permiso | Qué habilita |
|---|---|
| Leer citas | Consultar la agenda |
| Leer pacientes | Consultar el registro de pacientes |
| Crear y editar pacientes | Importar o sincronizar pacientes |
| Eliminar pacientes | Borrar del registro |
| Leer doctores | Consultar doctores y horarios |
| Crear y editar doctores | Importar doctores y sus horarios |
| Desactivar doctores | Retirar a un doctor de la agenda |
Eliminar es un permiso aparte de crear y editar, a propósito: así una clave que solo importa datos no puede borrar su registro si el programa que la usa tiene un error.
Si una clave intenta algo para lo que no tiene permiso, recibe un error 403 y no pasa nada.
Cómo se usa
La clave va en la cabecera Authorization de cada llamada:
curl https://api.pingclinica.com/api/public/v1/whoami \
-H "Authorization: Bearer pc_su_clave_aqui"
Nunca la ponga en la dirección (?api_key=…): quedaría registrada en los archivos de cada servidor por el que pase. Si lo intenta, la rechazamos.
Para comprobar que una clave funciona, use /whoami. Le devuelve su clínica, su zona horaria y los permisos de esa clave:
{
"clinic": { "id": "…", "name": "Clínica Vista", "timezone": "America/Guayaquil" },
"scopes": ["appointments:read", "patients:write"],
"expires_at": null
}
Leer citas
curl "https://api.pingclinica.com/api/public/v1/appointments?from=2026-09-01&to=2026-09-30" \
-H "Authorization: Bearer pc_su_clave_aqui"
Respuesta:
{
"data": [
{
"id": "8f14e45f-…",
"scheduled_at": "2026-09-15T14:00:00+00:00",
"scheduled_at_local": "2026-09-15T09:00:00-05:00",
"duration_minutes": 30,
"procedure_type": "consultation",
"status": "confirmed",
"patient_name": "Ana Torres",
"patient_phone": "593991112233",
"patient_id": "3c6e0b8a-…",
"provider_name": "Dra. Vega",
"provider_id": "1b6453892-…",
"created_at": "2026-09-01T18:22:10+00:00",
"updated_at": "2026-09-02T11:05:44+00:00"
}
],
"has_more": false,
"next_offset": null
}
Cada cita trae la hora dos veces: scheduled_at en UTC, para que su sistema haga cálculos sin ambigüedad, y scheduled_at_local en la zona de su clínica, para mostrarla tal como la vive su equipo.
Es la misma forma que reciben los avisos por HTTPS, así que si ya procesa avisos, no necesita escribir un segundo lector.
Filtros
| Parámetro | Ejemplo |
|---|---|
from, to | ?from=2026-09-01&to=2026-09-30 (fechas en la zona de su clínica) |
status | ?status=cancelled |
provider_id | ?provider_id=1b645389-… |
updated_since | ?updated_since=2026-09-08T12:00:00Z |
limit, offset | ?limit=100&offset=200 (máximo 200 por página) |
Sincronizar sin repetir trabajo
Para traer solo lo que cambió desde la última vez, use updated_since:
- Pida
?updated_since=<la última marca que guardó>. - Recorra las páginas con
next_offsethasta quehas_moreseafalse. - Guarde el
updated_atmás alto que vio y úselo la próxima vez.
Con updated_since ordenamos por fecha de modificación, no por fecha de cita. Eso importa: si alguien modifica una cita mientras usted está recorriendo páginas, esa cita se va al final en vez de mover las páginas que ya leyó, así no se le escapa ninguna.
Importar pacientes y doctores
Para cargar una lista existente, mande todo junto:
curl -X POST https://api.pingclinica.com/api/public/v1/patients/bulk \
-H "Authorization: Bearer pc_su_clave_aqui" \
-H "Content-Type: application/json" \
-d '{
"items": [
{ "name": "Ana Torres", "phone": "0991112233", "external_id": "PAC-001" },
{ "name": "Beto Paz", "phone": "0994445566", "external_id": "PAC-002" }
]
}'
La respuesta le dice qué pasó fila por fila:
{
"summary": { "created": 1, "updated": 0, "failed": 1 },
"results": [
{ "index": 0, "status": "created", "id": "3c6e0b8a-…" },
{ "index": 1, "status": "error", "error": "invalid_phone" }
]
}
Una fila con un error no cancela las demás. Corrija esa fila y vuelva a mandarla.
Repetir el envío es seguro
Use external_id: el identificador que ese paciente o doctor ya tiene en su sistema. Cuando lo manda, reconocemos el registro y lo actualizamos en vez de crear un duplicado. Así puede correr la importación todas las noches sin acumular repetidos.
- Pacientes: si no manda
external_id, usamos el teléfono. Un0991112233y un593991112233son el mismo paciente para nosotros. - Doctores: no hay forma de reconocerlos sin
external_id—dos doctores pueden llamarse igual—, así que sin él siempre se crea uno nuevo.
Horarios de los doctores
Puede importar el horario semanal:
{
"name": "Dra. Vega",
"external_id": "EMP-7",
"schedule": {
"mon": [{ "start": "09:00", "end": "13:00" }, { "start": "14:00", "end": "18:00" }],
"fri": [{ "start": "09:00", "end": "12:00" }]
}
}
Los días son mon, tue, wed, thu, fri, sat, sun. Las horas van en formato de 24 horas con dos dígitos (09:00, no 9:00). Un día que no aparece es un día que no atiende.
Validamos el horario al recibirlo y le decimos qué está mal, en vez de guardarlo y dejar que su agenda deje de mostrar turnos sin explicación.
Eliminar
- Pacientes: se borran del registro. Sus citas pasadas se conservan con el nombre y teléfono con que se agendaron.
- Doctores: se desactivan, no se borran. Un doctor con citas no se puede borrar sin borrar su historial, así que lo sacamos de la agenda y dejamos su historia intacta. Es lo mismo que hace el panel.
Límite de uso
Cada clave admite 60 llamadas por minuto. Si se pasa, recibe un 429 con la cabecera Retry-After; espere y reintente.
Un envío masivo cuenta como una sola llamada, sin importar cuántas filas lleve (hasta 500). Importar mil pacientes son dos llamadas, no mil.
Cambiar una clave
No hay «renovar»: para cambiar una clave, cree la nueva, actualice su sistema, y recién entonces elimine la vieja. Durante ese rato ambas funcionan, así que no se corta el servicio.
Eliminar una clave tiene efecto inmediato: la siguiente llamada que la use recibe un 401. Si sospecha que una clave se filtró, elimínela sin dudar — puede crear otra en segundos.
Errores
| Código | Qué significa |
|---|---|
401 | La clave no existe, fue eliminada o venció |
403 | La clave es válida pero le falta ese permiso |
404 | Ese registro no existe en su clínica |
409 | Ya existe un registro con ese teléfono o external_id |
422 | Un dato viene mal (revise el mensaje) |
429 | Pasó el límite de llamadas por minuto |
402 | La suscripción está suspendida: puede leer, pero no escribir |