Cómo Controlar la Lista de Acceso de Citas vía API Externa
Resumen
eAgenda permite validar, de forma automática, si un cliente está autorizado a realizar una cita utilizando una Lista de Acceso conectada a una API externa.
Cuando el cliente informa el CPF durante la cita, eAgenda envía una solicitud HTTP POST a la URL configurada, utilizando timestamp y firma HMAC-SHA256 para garantizar la seguridad e integridad de la comunicación.
En este documento encontrará:
- Cómo funciona la estructura de la solicitud enviada por eAgenda
- Cómo desarrollar la API externa responsable de la validación
- Cómo crear la Lista de Acceso que valida vía API externa
- Cómo compartir el enlace de esa lista con sus clientes
Estructura de la Solicitud Enviada por eAgenda
Cuerpo de la Solicitud (JSON)
eAgenda envía el identificador informado por el cliente en el campo configurado (ej.: CPF):
{ “identifier”: “12345678901” }
{
"identifier": "12345678901"
}
Encabezados Enviados
Los encabezados agregan seguridad y autenticación:
X-Timestamp: timestamp UNIX de la solicitudX-Signature: hash HMAC-SHA256 generado a partir del cuerpo + timestampContent-Type: application/json
Método
POST
Cómo Desarrollar su API Externa
La API externa debe:
- Verificar el timestamp para evitar replay attacks
- Validar la firma HMAC-SHA256
- Verificar si el identificador informado está autorizado
- Responder con
{ "authorized": true/false }
Ejemplo completo en Python + Flask
from flask import Flask, request, jsonify import hmac import hashlib import time
app = Flask(__name__)
SECRET_KEY = “mi-clave-secreta-super-segura-123”
CLIENTES_AUTORIZADOS = [ “01234567890”, “12345678901”, “98765432100”, “11122233344” ]
TIME_TOLERANCE = 120
def verify_signature(body, timestamp, received_signature): message = body + timestamp expected_signature = hmac.new( SECRET_KEY.encode(‘utf-8’), message.encode(‘utf-8’), hashlib.sha256 ).hexdigest() return hmac.compare_digest(expected_signature, received_signature)
@app.route(‘/validate’, methods=[‘POST’]) def validate_client(): timestamp_header = request.headers.get(‘X-Timestamp’) signature_header = request.headers.get(‘X-Signature’)
if not timestamp\_header or not signature\_header:
return jsonify({"error": "Los headers X-Timestamp y X-Signature son obligatorios"}), 400
body = request.get\_data(as\_text=True)
try:
request\_time = int(timestamp\_header)
current\_time = int(time.time())
diff = abs(current\_time - request\_time)
if diff > TIME\_TOLERANCE:
return jsonify({"authorized": False, "error": "Solicitud expirada"}), 403
except:
return jsonify({"error": "Timestamp inválido"}), 400
if not verify\_signature(body, timestamp\_header, signature\_header):
return jsonify({"authorized": False, "error": "Firma inválida"}), 403
data = request.get\_json()
identifier = data.get("identifier")
if not identifier:
return jsonify({"error": "El campo 'identifier' es obligatorio"}), 400
autorizado = identifier in CLIENTES\_AUTORIZADOS
return jsonify({"authorized": autorizado, "identifier": identifier}), 200
@app.route(‘/health’, methods=[‘GET’]) def health(): return jsonify({ “status”: “online”, “secret_key_configured”: True, “authorized_clients_count”: len(CLIENTES_AUTORIZADOS) }), 200
if __name__ == “__main__”: app.run(debug=True, port=5000)
from flask import Flask, request, jsonify
import hmac
import hashlib
import time
app = Flask(__name__)
SECRET_KEY = "mi-clave-secreta-super-segura-123"
CLIENTES_AUTORIZADOS = [
"01234567890",
"12345678901",
"98765432100",
"11122233344"
]
TIME_TOLERANCE = 120
def verify_signature(body, timestamp, received_signature):
message = body + timestamp
expected_signature = hmac.new(
SECRET_KEY.encode('utf-8'),
message.encode('utf-8'),
hashlib.sha256
).hexdigest()
return hmac.compare_digest(expected_signature, received_signature)
@app.route('/validate', methods=['POST'])
def validate_client():
timestamp_header = request.headers.get('X-Timestamp')
signature_header = request.headers.get('X-Signature')
if not timestamp_header or not signature_header:
return jsonify({"error": "Los headers X-Timestamp y X-Signature son obligatorios"}), 400
body = request.get_data(as_text=True)
try:
request_time = int(timestamp_header)
current_time = int(time.time())
diff = abs(current_time - request_time)
if diff > TIME_TOLERANCE:
return jsonify({"authorized": False, "error": "Solicitud expirada"}), 403
except:
return jsonify({"error": "Timestamp inválido"}), 400
if not verify_signature(body, timestamp_header, signature_header):
return jsonify({"authorized": False, "error": "Firma inválida"}), 403
data = request.get_json()
identifier = data.get("identifier")
if not identifier:
return jsonify({"error": "El campo 'identifier' es obligatorio"}), 400
autorizado = identifier in CLIENTES_AUTORIZADOS
return jsonify({"authorized": autorizado, "identifier": identifier}), 200
@app.route('/health', methods=['GET'])
def health():
return jsonify({
"status": "online",
"secret_key_configured": True,
"authorized_clients_count": len(CLIENTES_AUTORIZADOS)
}), 200
if __name__ == "__main__":
app.run(debug=True, port=5000)
Ejemplos de respuesta
Cliente autorizado
{ “authorized”: true, “identifier”: “12345678901” }
{
"authorized": true,
"identifier": "12345678901"
}
Cliente no autorizado
{ “authorized”: false, “identifier”: “12345678901” }
{
"authorized": false,
"identifier": "12345678901"
}
Cómo Crear la Lista de Acceso que Valida vía API Externa
Paso 1 — Acceder a la plataforma
- Ingrese en:
[https://eagenda.com.br](https://eagenda.com.br) - Inicie sesión con su cuenta.
Paso 2 — Acceder al menú correcto
- En el menú lateral, haga clic en Cuenta
- Haga clic en Acceso de Clientes

Paso 3 — Crear nueva lista
- Haga clic en Nueva Lista

- En el campo Nombre de la Lista, coloque cualquier nombre (ej.:
teste) - Los demás campos pueden quedar en blanco

Paso 4 — Configurar el tipo de validación
- Inicio de sesión obligatorio: desmarcar
- Usar Lista Externa de Acceso: marcar
- Tipo de Clave de Acceso: seleccionar CPF

Paso 5 — Configurar integración externa
Completar:
- URL de la API Externa:
Ej.:
https://suservidor.com/validate - Clave Secreta:
Ej.:
mi-clave-secreta-super-segura-123
Paso 6 — Finalizar
Haga clic en Guardar.
Su lista está lista para validar automáticamente cada CPF a través de la API externa.
Cómo Compartir la Lista con los Clientes
- En eAgenda, vaya a Cuenta → Acceso de Clientes
- Localice la lista creada
- Haga clic en Acciones
- Seleccione Copiar enlace compartido

Ese enlace puede ser enviado a los clientes: Ellos ingresan el CPF → el sistema consulta la API → libera o bloquea automáticamente la cita.

Contáctenos o Conozca Más
Estamos a su disposición para ayudarle. Acceda a nuestros canales oficiales:
📞 WhatsApp : Haga clic aquí para enviarnos un mensaje 🌐 Plataforma eAgenda : Conozca eAgenda 🏢 Nuestra Empresa : Mupi Systems – Soluciones Innovadoras 📧 Correo electrónico : contato@mupisystems.com.br 📚 Tutoriales y Documentación : Acceda a nuestras guías y tutoriales