Saltar al contenido principal
Recibe los resultados de las tareas mediante callbacks HTTP en lugar de polling.

Resumen

Cuando usas el modo callback, APIXO envía una solicitud POST a tu URL especificada cuando una tarea finaliza. Esto elimina la sobrecarga del polling y proporciona notificaciones inmediatas — ideal para aplicaciones de producción con alto volumen.

Configuración

1

Crear un endpoint webhook

Tu endpoint debe aceptar solicitudes POST, responder con HTTP 200 en 30 segundos y ser accesible públicamente vía HTTPS.
Si tu endpoint no responde con HTTP 200 en 30 segundos, APIXO reintentará la entrega hasta 3 veces con retrasos crecientes.
const express = require('express');
const app = express();

app.use(express.json());

app.post('/webhook/apixo', (req, res) => {
  const { taskId, state, resultJson, failCode, failMsg } = req.body.data;
  
  if (state === 'success') {
    const urls = JSON.parse(resultJson).resultUrls;
    console.log('Generated:', urls);
  } else if (state === 'failed') {
    console.error(`Task ${taskId} failed: ${failCode} - ${failMsg}`);
  }
  
  res.status(200).send('OK');
});

app.listen(3000);
2

Enviar una tarea con callback

Incluye request_type: "callback" y tu callback_url en la solicitud:
curl -X POST https://api.apixo.ai/api/v1/generateTask/nano-banana \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "request_type": "callback",
    "callback_url": "https://your-domain.com/webhook/apixo",
    "input": {
      "mode": "text-to-image",
      "prompt": "A beautiful landscape"
    }
  }'

Payload del webhook

Success

{
  "code": 200,
  "message": "success",
  "data": {
    "taskId": "task_abc123xyz",
    "state": "success",
    "resultJson": "{\"resultUrls\":[\"https://cdn.apixo.ai/output/abc.jpg\"]}",
    "costTime": 12500,
    "createTime": 1704067200000,
    "completeTime": 1704067212500
  }
}

Failure

{
  "code": 200,
  "message": "success",
  "data": {
    "taskId": "task_abc123xyz",
    "state": "failed",
    "failCode": "CONTENT_VIOLATION",
    "failMsg": "Content violates usage policy",
    "createTime": 1704067200000,
    "completeTime": 1704067205000
  }
}

Campos del payload

taskId
string
Identificador único de la tarea.
state
string
Estado final de la tarea: success o failed.
resultJson
string
Cadena JSON que contiene el array resultUrls. Solo presente en éxito.
costTime
integer
Tiempo de procesamiento en milisegundos.
failCode
string
Código de error. Solo presente en fallo.
failMsg
string
Mensaje de error legible. Solo presente en fallo.

Política de reintentos

Si tu endpoint webhook no responde con HTTP 200:
IntentoRetraso
1.º reintento30 segundos
2.º reintento2 minutos
3.º reintento10 minutos
Después de 3 intentos fallidos, el webhook se abandona. Aún puedes consultar el estado de la tarea vía el endpoint Estado de tarea.

Recomendaciones de seguridad

Implementar idempotencia

Los webhooks pueden entregarse más de una vez. Usa taskId para desduplicar y evitar procesar el mismo resultado dos veces.
const processedTasks = new Set();

app.post('/webhook/apixo', (req, res) => {
  const { taskId } = req.body.data;
  
  if (processedTasks.has(taskId)) {
    return res.status(200).send('Already processed');
  }
  
  processedTasks.add(taskId);
  // Process the task...
  
  res.status(200).send('OK');
});

Usar solo HTTPS

Siempre usa HTTPS para tu endpoint webhook para garantizar que los datos se cifren en tránsito.

Probar webhooks

Usa ngrok para exponer tu servidor local durante el desarrollo:
ngrok http 3000
# Devuelve: https://abc123.ngrok.io — usa esto como tu callback_url
También puedes consultar el estado de la tarea vía la API incluso en modo callback, lo cual es útil para depuración.