Programar un callback diferido
Hay pasos de un flujo que no pueden ejecutarse de inmediato: un recordatorio de prueba a los tres días, un aviso de carrito abandonado dos horas después, una verificación de cumplimiento a treinta días vista. La API Callback Diferido recibe un payload y un tiempo de espera, y dispara el webhook exactamente cuando lo pidió, sin que tenga que mantener su propio programador para un solo evento diferido.
El hueco que casi ningún stack cubre bien
La mayoría de las aplicaciones están pensadas para reaccionar a lo que pasa ahora mismo: un formulario, un pago, un registro. Cuando necesita que algo ocurra más tarde —no en una fecha fija, sino un retraso relativo a un evento— los equipos suelen improvisar con un cron, montan una cola de mensajes, o escriben una fila en una base de datos y la revisan cada minuto. Las tres opciones funcionan, pero son un exceso de ingeniería para disparar una sola llamada de retorno. dev.delay existe justo para ese hueco: usted describe la espera, nosotros llevamos el reloj.
Qué pasa después de llamarla
Envía una duración de espera y el payload que quiera que se le devuelva, desde unos segundos hasta 30 días después. La tarea se acepta de inmediato y recibe un task_id para que su código pueda seguir sin bloquearse. Internamente, la solicitud queda en espera hasta que llega el momento pedido, y entonces se dispara: como webhook firmado hacia el endpoint que configuró, o como enlace firmado que puede consultar, válido por 24 horas. Nada se ejecuta antes de tiempo, y si el intento de entrega falla no se le cobra; reintentamos tres veces antes de devolver un error claro.
Dónde se usa esto en la práctica
Secuencias de onboarding que necesitan un empujón si el usuario no terminó la configuración al segundo día. Sistemas de pedidos que cancelan facturas impagas tras un período de gracia. Reintentos con límite de frecuencia donde deliberadamente quiere esperar antes de volver a llamar a un servicio externo. Correos recordatorio, avisos de vencimiento de prueba, temporizadores de escalamiento para tickets de soporte sin respuesta: cualquier lugar donde la lógica sea 'haga esto, a menos que pase otra cosa antes, después de N minutos'.
Un poco de contexto sobre las colas con retraso
La entrega diferida de mensajes es una idea antigua en sistemas de mensajería; la mayoría de las tecnologías de colas añadieron un 'tiempo de invisibilidad' o una 'entrega programada' solo después de ver que los desarrolladores construían una y otra vez el mismo parche: escribir ahora, despertar después. Tomamos esa idea y la expusimos como un único endpoint sin estado, para que no tenga que adoptar toda una plataforma de colas solo para diferir una llamada.
Cómo encaja en los flujos que ya tiene
Como la llamada es asíncrona y devuelve un task_id de inmediato, se integra sin fricción con la orquestación que ya usa: dispara una tarea de retraso como un paso más en una cadena mayor, guarda el task_id para auditoría, y deja que el webhook reanude el siguiente paso cuando llegue. No hay que mantener un bucle de sondeo ni recordar borrar una entrada de cron.
Qué puede hacer con ella
Recordatorios de vencimiento de prueba
Programe una llamada 24 horas antes de que termine una prueba, para que su sistema de facturación envíe el aviso correcto sin revisar fechas todo el día.
Seguimiento de carrito abandonado
Difiera una llamada dos horas después de iniciar el checkout; si el webhook del pedido nunca llega antes, el callback diferido dispara su correo de recuperación.
Cancelaciones con período de gracia
Mantenga una factura impaga en espera durante 30 días y deje que el callback diferido active automáticamente el flujo de cancelación si el pago nunca se registró.
Escalamiento de tickets de soporte
Defina un retraso al abrir un ticket; si sigue sin resolverse cuando llega el callback, escálelo automáticamente a una cola de supervisión.
Preguntas frecuentes
¿Cuánto puede durar el retraso?
Desde aproximadamente 60 segundos hasta 30 días a partir del momento en que se acepta la solicitud.
¿Hay un plan gratuito para probar?
No hay capa gratuita: las capas gratis se abusan y ralentizan a todos. El acceso funciona con un saldo prepago de ForHosting KIT: se recarga desde $10.00 (no caduca) y cada solicitud se cobra a su precio publicado, así que una llamada sin saldo devuelve HTTP 402. Sin suscripción, sin tokens ni créditos inventados, y una tarea fallida no se cobra.
¿Cómo recibo el resultado?
Por webhook firmado hacia su endpoint (recomendado para producción) o por enlace firmado que consulta manualmente, válido por 24 horas.
¿Qué pasa si mi endpoint de webhook está caído?
Reintentamos la entrega tres veces; si las tres fallan, recibe un error claro y esa tarea no se le cobra.
¿Puedo cancelar una llamada ya programada?
La tarea se ejecuta hasta el final una vez aceptada; si su flujo podría cambiar de opinión, guarde el task_id y condicione la acción posterior al estado actual en vez de depender de una cancelación.
¿Se guarda el payload de forma permanente?
No. Los datos asociados a la tarea se eliminan al terminar el período de retención y nunca se usan para entrenamiento.
¿Cuánto cuesta?
0.002 dólares por solicitud, cobrados solo cuando la entrega es exitosa; las tareas fallidas nunca se cobran.
¿Puedo usar esto en vez de mantener mis propios cron jobs?
Para retrasos puntuales relativos a un evento, sí: evite montar un programador completo solo para disparar una llamada más tarde.
Para desarrolladores — acceso por API
Todo lo de esta página está disponible por programación. Esta sección es para equipos que quieren integrarlo en sus sistemas; el resto puede usar la herramienta de arriba sin más.
Endpoint de API
¿Prefiere automatizarlo? Un POST autenticado crea la tarea; el resultado llega por webhook o enlace firmado. La misma capacidad también se ejecuta aquí en la web, y pronto desde nuestra app, el email y Telegram.
Llámela desde su stack
curl -X POST https://api.kit.forhosting.com/dev/delay \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"input":"…"}'const res = await fetch("https://api.kit.forhosting.com/dev/delay", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"input": "…"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/dev/delay",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"input": "…"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/dev/delay", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"input":"…"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"input":"…"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/dev/delay", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Ejemplo de solicitud
{
"input": "…"
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev.delay",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}La API es asíncrona: la llamada devuelve un task_id al instante y el resultado llega por webhook. El polling está limitado a 1 req/s por tarea.
Precio
Precio publicado — sin tokens ni créditos inventados. Una tarea fallida no se cobra.
Errores
| HTTP | Código | Significado |
|---|---|---|
401 | unauthorized | API key ausente o inválida. |
402 | insufficient_balance | El saldo no cubre el precio de la tarea. |
404 | unknown_type | El tipo de tarea no existe. |
429 | rate_limited | Demasiadas peticiones. Use el webhook en vez de sondear. |