Las fallas de red ocurren. Su solicitud de API se agota, por lo que su cliente la reintenta. Sin las protecciones adecuadas, ese reintento crea un segundo ticket, un tercer ticket, y de repente su cliente tiene tres solicitudes de soporte idénticas en el sistema. Las claves de idempotencia resuelven este problema al garantizar que las solicitudes repetidas con la misma clave produzcan el mismo resultado sin crear duplicados.
Si está creando integraciones con la API de Zendesk, comprender las claves de idempotencia no es opcional. Es esencial para los sistemas listos para producción que manejan datos reales de clientes.
¿Qué son las claves de idempotencia y por qué son importantes?
Una clave de idempotencia es un identificador único que los clientes incluyen con las solicitudes de API. Cuando su servidor recibe una solicitud, verifica si ha visto esa clave antes. Si la clave es nueva, la solicitud se procesa normalmente y el resultado se almacena. Si la clave existe, se devuelve el resultado almacenado sin volver a ejecutar la operación.
El concepto proviene de las matemáticas, donde una operación idempotente produce el mismo resultado ya sea que se ejecute una o varias veces. En términos de API, publicar un ticket con la misma clave de idempotencia cinco veces debería crear exactamente un ticket y devolver la misma respuesta cada vez.
He aquí por qué esto importa para Zendesk específicamente. La creación de tickets es una operación de escritura con efectos secundarios. Cada ticket activa notificaciones, reglas de enrutamiento y, potencialmente, temporizadores de SLA (Service Level Agreement). Crear tickets duplicados no solo satura su sistema. Desperdicia el tiempo del agente, confunde a los clientes que reciben múltiples reconocimientos y sesga sus métricas.
Escenarios del mundo real donde la idempotencia le ahorra:
- Webhooks de pago Su procesador de pagos envía un webhook para crear un ticket para las transacciones fallidas. El webhook se reintenta en caso de tiempo de espera. Sin idempotencia, cada reintento crea un nuevo ticket.
- Importaciones masivas Está migrando tickets de un sistema antiguo. El script de importación encuentra un error de red y se reinicia. Sin idempotencia, obtiene registros duplicados.
- Aplicaciones móviles Un usuario toca enviar dos veces debido al retraso. Sin idempotencia, crean dos tickets.
Construir una lógica de reintento confiable manualmente es complejo. Necesita rastrear qué solicitudes tuvieron éxito, manejar fallas parciales y conciliar el estado en sistemas distribuidos. Las claves de idempotencia empujan esta complejidad a la capa de API donde pertenece.
Si está buscando automatizar la creación de tickets sin manejar estos casos extremos usted mismo, nuestro Agente de IA gestiona la idempotencia automáticamente como parte de su integración de Zendesk.

Cómo funciona la implementación de la clave de idempotencia de Zendesk
Zendesk implementa la idempotencia a través de un encabezado HTTP simple. Para usarlo, incluya un encabezado Idempotency-Key con un valor único en su solicitud:
Idempotency-Key: {clave_única}
El valor puede ser cualquier cadena de hasta 255 caracteres. Zendesk recomienda usar UUID (Universally Unique Identifier) u otros identificadores de alta entropía.
Cuando realiza una solicitud con una clave de idempotencia, la respuesta de Zendesk incluye un encabezado x-idempotency-lookup:
x-idempotency-lookup: missEsta es la primera vez que se ve esta clave. La solicitud se procesa normalmente.x-idempotency-lookup: hitEsta clave se usó antes. Zendesk devuelve la respuesta almacenada en caché de la solicitud original.
Aquí está la parte crítica. Zendesk almacena las claves de idempotencia durante 2 horas. Después de esa ventana, una solicitud con la misma clave se tratará como nueva. Esto significa que su lógica de reintento debe tener en cuenta la ventana de expiración. Si está reintentando una solicitud de ayer, creará un duplicado.
Zendesk también valida que las solicitudes con la misma clave de idempotencia tengan parámetros idénticos. Si envía la misma clave con un asunto o descripción diferente, obtiene un error 400:
{
"error": "IdempotentRequestError",
"description": "Los parámetros de la solicitud no coinciden con la clave de idempotencia dada"
}
Esto evita el uso indebido accidental de claves en diferentes operaciones. También significa que necesita generar una clave nueva para cada operación distinta, no reutilizar claves en diferentes tickets.
Limitación importante: la clave de idempotencia no se almacena como parte del ticket. Cuando recupere un ticket más tarde, no verá qué clave se usó para crearlo. Si necesita rastrear esta correlación, almacénela en su propio sistema.
No todos los puntos finales de la API de Zendesk admiten la idempotencia. El caso de uso principal es la creación de tickets (POST /api/v2/tickets.json). Consulte la documentación oficial para el punto final específico que está utilizando.
Implementación de claves de idempotencia en su código
Repasemos una implementación práctica. Usaremos Python con la biblioteca requests, pero el patrón se aplica a cualquier idioma.
Paso 1: Generar claves de idempotencia únicas
Genere su clave de idempotencia antes de realizar la primera solicitud, no durante los reintentos. La clave debe ser única por operación lógica.
import uuid
idempotency_key = str(uuid.uuid4())
request_context = {
'idempotency_key': idempotency_key,
'payload': ticket_data,
'attempt': 0
}
Use UUIDv4 u otra cadena aleatoria con al menos 128 bits de entropía. Evite patrones predecibles como marcas de tiempo, ID secuenciales o hashes de la carga útil solamente. Estos pueden colisionar o adivinarse.
Paso 2: Agregar el encabezado a sus solicitudes de API
Incluya la clave de idempotencia en los encabezados de su solicitud junto con su autenticación.
Ejemplo de Python:
import requests
import os
subdomain = os.getenv('ZENDESK_SUBDOMAIN')
email = os.getenv('ZENDESK_EMAIL')
api_token = os.getenv('ZENDESK_API_TOKEN')
url = f'https://{subdomain}.zendesk.com/api/v2/tickets.json'
auth = (f'{email}/token', api_token)
headers = {
'Content-Type': 'application/json',
'Idempotency-Key': idempotency_key
}
data = {
'ticket': {
'subject': 'Notificación de pago fallido',
'comment': {'body': 'El método de pago del cliente fue rechazado'},
'requester': {'email': 'customer@example.com'}
}
}
response = requests.post(url, json=data, auth=auth, headers=headers)
Ejemplo de cURL:
curl https://yourcompany.zendesk.com/api/v2/tickets.json \
-d '{"ticket": {"subject": "Ticket de prueba", "comment": {"body": "Esto es una prueba"}}}' \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000" \
-u your@email.com/token:your_api_token \
-X POST
Ejemplo de JavaScript/Node.js:
const response = await fetch('https://company.zendesk.com/api/v2/tickets.json', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Basic ' + Buffer.from(`${email}/token:${token}`).toString('base64'),
'Idempotency-Key': idempotencyKey
},
body: JSON.stringify(ticketData)
});
Paso 3: Manejar respuestas y reintentos
Su lógica de reintento debe verificar el estado de la respuesta y los encabezados para determinar si se debe reintentar.
import time
def create_ticket_with_retry(ticket_data, max_retries=3):
idempotency_key = str(uuid.uuid4())
for attempt in range(max_retries + 1):
headers = {
'Content-Type': 'application/json',
'Idempotency-Key': idempotency_key
}
response = requests.post(
url,
json=ticket_data,
auth=auth,
headers=headers
)
# Check if this was a cached response
lookup_status = response.headers.get('x-idempotency-lookup')
if lookup_status == 'hit':
print(f"Request was cached (attempt {attempt + 1})")
# Success case
if response.status_code == 201:
return response.json()
# Idempotency mismatch - don't retry, this is a logic error
if response.status_code == 400 and 'IdempotentRequestError' in response.text:
raise ValueError(f"Idempotency key mismatch: {response.json()['description']}")
# Rate limited - wait and retry
if response.status_code == 429:
retry_after = int(response.headers.get('Retry-After', 60))
time.sleep(retry_after)
continue
# Server errors - retry with exponential backoff
if response.status_code in [500, 502, 503, 504]:
if attempt < max_retries:
backoff = (2 ** attempt) + (hash(idempotency_key) % 1000 / 1000)
time.sleep(backoff)
continue
# Client errors (4xx) - don't retry
response.raise_for_status()
raise Exception("Max retries exceeded")
Puntos clave para su lógica de reintento:
- Reutilice la misma clave de idempotencia en todos los reintentos de la misma operación lógica
- No reintente en errores 400 con
IdempotentRequestError: esto indica un error lógico en su código - Respete los límites de velocidad (429) utilizando el encabezado
Retry-After - Use retroceso exponencial para errores del servidor para evitar sobrecargar la API
Para obtener más detalles sobre la estructura de la API de tickets de Zendesk, consulte nuestra guía sobre cómo crear tickets de Zendesk usando la API.
Mejores prácticas para implementaciones de producción
Una vez que tenga lo básico funcionando, considere estas prácticas listas para producción.
Estrategias clave de almacenamiento. Para sistemas de alto volumen, es posible que desee rastrear las claves de idempotencia en su propia base de datos o caché. Esto le permite:
- Detectar si una clave está a punto de caducar (ventana de 2 horas de Zendesk)
- Auditar qué operaciones tuvieron éxito o fallaron
- Implementar lógica de deduplicación personalizada más allá de Zendesk
Redis es una opción popular para esto. Establezca un TTL (Time To Live) ligeramente más corto que la ventana de 2 horas de Zendesk para evitar casos extremos:
import redis
redis_client = redis.Redis(host='localhost', port=6379)
redis_client.setex(f"zendesk:idempotency:{key}", 5400, response_data)
Manejar solicitudes concurrentes. Si dos solicitudes con la misma clave de idempotencia llegan simultáneamente, Zendesk procesará una y devolverá el resultado almacenado en caché para la otra. Sin embargo, su cliente podría ver condiciones de carrera. Implemente la deduplicación de solicitudes en su capa de aplicación si esto es una preocupación.
Huella digital de la solicitud. Para detectar errores donde accidentalmente reutiliza una clave con diferentes parámetros, haga un hash de la carga útil de la solicitud y almacénela con la clave de idempotencia. Antes de enviar, verifique que el hash coincida:
import hashlib
import json
def get_request_fingerprint(payload):
return hashlib.sha256(json.dumps(payload, sort_keys=True).encode()).hexdigest()
fingerprint = get_request_fingerprint(ticket_data)
store_key_with_fingerprint(idempotency_key, fingerprint)
if get_fingerprint_for_key(idempotency_key) != fingerprint:
raise ValueError("Payload changed for existing idempotency key")
Registro y monitoreo. Rastree el uso de la clave de idempotencia en sus registros:
- Registre la clave y el estado
x-idempotency-lookuppara cada solicitud - Alerte sobre altas tasas de respuestas
hit(puede indicar reintentos excesivos) - Supervise
IdempotentRequestError(indica errores)
Prueba de su implementación. Escriba pruebas que verifiquen su lógica de idempotencia:
def test_duplicate_request_returns_same_ticket():
key = str(uuid.uuid4())
# First request
response1 = create_ticket(ticket_data, idempotency_key=key)
ticket_id = response1['ticket']['id']
# Second request with same key
response2 = create_ticket(ticket_data, idempotency_key=key)
assert response2['ticket']['id'] == ticket_id
assert response2.headers['x-idempotency-lookup'] == 'hit'
Errores comunes y cómo evitarlos
Incluso los desarrolladores experimentados cometen estos errores al implementar la idempotencia.
Usar patrones de clave predecibles. Las marcas de tiempo, los ID secuenciales o los hashes simples de la carga útil pueden colisionar o adivinarse. Utilice siempre valores criptográficamente aleatorios como UUIDv4.
Generar nuevas claves al reintentar. El objetivo principal es usar la misma clave para los reintentos. Si genera un UUID nuevo en cada intento, creará duplicados en lugar de prevenirlos.
Ignorar la expiración de 2 horas. Si su lógica de reintento abarca más de 2 horas (quizás debido a interrupciones prolongadas), su clave de idempotencia ya no funcionará. Para procesos de larga duración, implemente su propia capa de deduplicación.
No manejar errores de falta de coincidencia de parámetros. Cuando recibe un IdempotentRequestError, generalmente es un error en su código. Está reutilizando una clave con datos diferentes. Registre estos agresivamente y corrija la causa raíz.
Almacenar en caché las respuestas de error incorrectamente. Algunas implementaciones almacenan en caché todas las respuestas, incluidos los errores 5xx. Esto significa que un error transitorio del servidor se "atasca" y todos los reintentos devuelven el mismo error. Solo almacene en caché las respuestas exitosas (códigos de estado 2xx).
Condiciones de carrera en entornos concurrentes. Sin el bloqueo adecuado, dos hilos podrían verificar la existencia de una clave, ambos ven que falta y ambos envían solicitudes. Use operaciones atómicas o bloqueos distribuidos si está procesando grandes volúmenes.
Automatización de la creación de tickets sin la complejidad
Construir y mantener integraciones de API lleva tiempo. Necesita manejar la autenticación, la lógica de reintento de errores, la limitación de velocidad, la idempotencia y el mantenimiento continuo a medida que cambian las API.
Si su objetivo es automatizar la creación de tickets en lugar de crear una integración personalizada, considere si realmente necesita escribir código. Herramientas como eesel AI pueden manejar la creación de tickets y las respuestas sin ningún trabajo de desarrollo.

Aquí está la diferencia. Con el enfoque de la API, está escribiendo scripts para crear tickets a los que los humanos responderán. Con un agente de IA, está entrenando un sistema para comprender su negocio y manejar todo el ciclo de vida del ticket, desde la creación hasta la resolución. Lo conecta a su cuenta de Zendesk y aprende de sus tickets anteriores, artículos del centro de ayuda y macros.
El modelo de lanzamiento progresivo significa que comienza con la IA redactando respuestas para su revisión, luego se expande a la automatización completa a medida que se demuestra. Para los equipos que buscan reducir el volumen de tickets en lugar de simplemente automatizar la creación, esto a menudo ofrece resultados más rápidos que el desarrollo de API personalizado.
Nuestro AI Copilot también puede ayudar redactando respuestas que sus agentes revisan antes de enviar, brindándole asistencia de IA sin la complejidad de construir una lógica de reintento idempotente usted mismo.
Preguntas frecuentes
Compartir esta entrada

Article by
Stevia Putri
Stevia Putri is a marketing generalist at eesel AI, where she helps turn powerful AI tools into stories that resonate. She’s driven by curiosity, clarity, and the human side of technology.



