Cómo usar las claves de idempotencia de la API de Zendesk para evitar tickets duplicados

Stevia Putri
Written by

Stevia Putri

Reviewed by

Stanley Nicholas

Last edited 2 marzo 2026

Expert Verified

Imagen de banner para Cómo usar las claves de idempotencia de la API de Zendesk para evitar tickets duplicados

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.

Las claves de idempotencia evitan solicitudes de API duplicadas al almacenar en caché las respuestas
Las claves de idempotencia evitan solicitudes de API duplicadas al almacenar en caché las respuestas

¿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.

Panel de control de eesel AI para configurar el agente supervisor
Panel de control de eesel AI para configurar el agente supervisor

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: miss Esta es la primera vez que se ve esta clave. La solicitud se procesa normalmente.
  • x-idempotency-lookup: hit Esta 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.

Árbol de decisión de la lógica de reintento para manejar escenarios de respuesta de la API
Árbol de decisión de la lógica de reintento para manejar escenarios de respuesta de la API

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-lookup para 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.

Barra lateral de eesel AI Copilot que muestra una respuesta sugerida a un cliente
Barra lateral de eesel AI Copilot que muestra una respuesta sugerida a un cliente

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

No. Las claves de idempotencia son más importantes para las operaciones de escritura que crean recursos, como la creación de tickets. Las operaciones de lectura (solicitudes GET) son naturalmente idempotentes. Las operaciones de actualización pueden o no necesitarlas, dependiendo de si los duplicados causarían problemas.
La solicitud procede normalmente, pero los reintentos crearán tickets duplicados. Si su red es confiable y tiene una lógica de reintento simple, es posible que nunca lo note. Pero los sistemas de producción deben usar claves de idempotencia para cualquier creación automatizada de tickets.
Sí, después de 2 horas Zendesk trata la clave como nueva. Si necesita ventanas más largas, implemente su propia capa de deduplicación que rastree los tickets creados en su base de datos.
Para sistemas de alto volumen, sí. Almacenar las claves le permite auditar las operaciones, detectar problemas de expiración e implementar la deduplicación personalizada. Para integraciones simples, puede confiar únicamente en el almacenamiento de Zendesk.
Este error significa que está reutilizando una clave con diferentes parámetros de solicitud. Revise su código en busca de errores donde la carga útil cambie entre reintentos. Registre el error y corrija la causa raíz. No reintente estos errores.
Consulte la documentación específica del punto final. Las operaciones masivas tienen su propia semántica para manejar fallas parciales. El patrón de clave de idempotencia estándar se aplica a la creación de tickets individuales, no necesariamente a las importaciones masivas.

Compartir esta entrada

Stevia undefined

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.