Asincronía y webhooks
Para PDFs grandes, capturas de pantalla de página completa o alto volumen, renderiza asincrónicamente: encola el trabajo, obtén un id inmediatamente, luego sondea o recibe un webhook firmado.
# Encolar
Agrega async: true (o un webhookUrl, o un notifyEmail) a cualquier solicitud render o screenshot. Proporciona webhookUrl para una devolución de llamada firmada, notifyEmail para recibir un email cuando el trabajo se complete, o ninguno y simplemente sondea:
curl https://api.mostlyrender.com/v1/renders \
-H "Authorization: Bearer mr_live_…" \
-H "Content-Type: application/json" \
-d '{
"template": "tpl_abc",
"output": "pdf",
"async": true,
"webhookUrl": "https://your.app/hooks/mostlyrender"
}'
{ "id": "job_xyz789", "status": "queued" }
La respuesta es 202 Accepted con un id de trabajo.
# Sondeo
curl https://api.mostlyrender.com/v1/renders/job_xyz789 \
-H "Authorization: Bearer mr_live_…"
{
"id": "job_xyz789",
"status": "done",
"kind": "render",
"result": { "id": "rnd_abc", "url": "https://img.mostlyrender.com/…/rnd_abc.pdf", "output": "pdf" },
"error": null
}
status avanza queued → processing → done (o error). Cuando es done, result contiene el render { id, url, output }.
job = mr.render_async("tpl_abc", output="pdf", webhook_url="https://your.app/hooks/mostlyrender")
final = mr.wait_for_render(job["id"])
print(final["result"]["url"])
# Webhooks
Si pasas un webhookUrl, MostlyRender POSTea el resultado del trabajo allí cuando se complete:
{
"id": "job_xyz789",
"status": "done",
"result": { "id": "rnd_abc", "url": "https://img.mostlyrender.com/…/rnd_abc.pdf", "output": "pdf" }
}
# Verifica la firma
Cada webhook lleva una firma HMAC-SHA256 del cuerpo sin procesar en el encabezado x-mostlyrender-signature, prefijado con sha256=. Recalculala con tu clave de firma y compara en tiempo constante:
import crypto from 'node:crypto';
function verify(rawBody, header, secret) {
const expected = 'sha256=' + crypto.createHmac('sha256', secret).update(rawBody).digest('hex');
return crypto.timingSafeEqual(Buffer.from(header), Buffer.from(expected));
}
Responde con cualquier 2xx para confirmar. La entrega se reintenta algunas veces en caso de error; los objetivos de webhook están protegidos contra SSRF tal como lo están las URLs de captura de pantalla.