Errores
Todo error tiene la misma forma:
{
"error": {
"codigo": "horario_ocupado",
"mensaje": "Ese horario ya está ocupado (de 08:30 a 09:00).",
"detalle": { "ocupadoDesde": "08:30", "ocupadoHasta": "09:00" },
"idSolicitud": "9f2c4a7e1b3d5c60"
}
}
codigoes estable: es lo que tu código tiene que comparar.mensajees para vos, en español. Puede cambiar de redacción: no lo compares ni se lo muestres tal cual al paciente.detalleaparece cuando aplica: elcampoque falló, los permisos que faltan, el límite que se alcanzó.idSolicitudes el mismo valor de la cabeceraX-Solicitud-Id. Guardalo: es lo que te va a pedir soporte.
Todos los códigos
| HTTP | codigo |
Qué pasó | Qué hacer |
|---|---|---|---|
| 400 | solicitud_invalida |
La forma del pedido: un campo que falta, que sobra o con formato equivocado | Corregir el pedido; detalle.campo dice cuál |
| 400 | json_invalido |
El cuerpo no es JSON válido | Corregir el pedido |
| 401 | no_autenticado |
Clave ausente, mal copiada, desconocida, revocada o vencida. Siempre el mismo código, para no delatar cuál | Revisar la cabecera Authorization: Bearer osk_…; si la clave anduvo antes, la clínica la revocó |
| 403 | api_deshabilitada |
La clínica no tiene la API activa | La clínica la pide a Odontosys |
| 403 | permiso_insuficiente |
A la clave le falta el permiso de esa operación | La clínica crea una clave con ese permiso; detalle.permisosRequeridos dice cuál |
| 403 | cita_no_creada_por_api |
Se intentó eliminar una cita que cargó la clínica | Sólo se eliminan las citas que creó la API |
| 404 | no_encontrado |
No existe, es de otra clínica, o es de una agenda que la clave no ve o está inactiva | |
| 409 | horario_ocupado |
Otra cita ocupa ese horario | Volver a pedir la disponibilidad y ofrecer otro |
| 409 | referencia_ya_usada |
La referenciaExterna ya se usó para una cita que ya no existe |
Mandar otra referencia |
| 409 | cita_no_eliminable |
La cita ya pasó, o la clínica ya marcó la asistencia o la llegada | No se puede eliminar por la API |
| 410 | cita_eliminada |
La cita existió y se eliminó | |
| 410 | cita_reprogramada |
La clínica movió la cita: existe con otro id | Ver Si la clínica la mueve |
| 413 | cuerpo_demasiado_grande |
El cuerpo pasa de 64 KB | |
| 422 | paciente_invalido |
El paciente no existe en la clínica o está inactivo | Agendar como alguien sin ficha |
| 422 | fecha_fuera_de_rango |
Fecha anterior a hoy o posterior a hoy + 365 días | |
| 422 | duracion_invalida |
Duración fuera de 5 a 480 minutos, o la cita termina después de las 23:59 | |
| 422 | agenda_no_trabaja |
La agenda no atiende ese día | Ofrecer otro día |
| 422 | fuera_de_horario |
La cita no entra entera en la jornada o pisa el descanso | Ofrecer otro horario |
| 429 | limite_por_minuto |
Demasiados pedidos seguidos con esta clave | Esperar Retry-After segundos |
| 429 | demasiadas_solicitudes_en_curso |
Demasiados pedidos a la vez con esta clave | Esperar a que terminen los anteriores |
| 429 | cupo_diario_agotado |
La clínica usó el cupo del día | Reintentar al día siguiente (hora de la clínica) |
| 500 | error_interno |
Algo falló de nuestro lado | Reintentar más tarde; si se repite, avisar a soporte con el idSolicitud |
| 503 | no_disponible |
La API está pausada, saturada, o la base no respondió a tiempo | Esperar Retry-After segundos y reintentar |
Existe además agenda_no_permitida en el catálogo, pero hoy nunca se devuelve: una agenda fuera de la lista de la clave responde 404.
Qué reintentar
| Respuesta | ¿Reintentar? |
|---|---|
429, 503 |
Sí, después de Retry-After |
500 |
Sí, pocas veces y espaciado |
Un corte de red o un timeout en un POST |
Sí, con la misma referenciaExterna (no duplica) |
400, 401, 403, 404, 409, 410, 413, 422 |
No: el mismo pedido va a dar lo mismo |
Detalle en Límites y reintentos.