Async et webhooks
Pour les gros PDF, les captures d’écran pleine page ou un volume élevé, rendez asynchronement : enfilez la tâche, récupérez un id immédiatement, puis soit interrogez soit recevez un webhook signé.
# Enqueue
Ajoutez async: true (ou une webhookUrl, ou une notifyEmail) à une demande render ou screenshot quelconque. Fournissez webhookUrl pour un rappel signé, notifyEmail pour être notifié par email à la fin de la tâche, ou aucun et interrogez simplement :
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 réponse est 202 Accepted avec un id de tâche.
# Poll
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 passe queued → processing → done (ou error). Quand done, result contient le 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 vous passez une webhookUrl, MostlyRender POSTs le résultat de la tâche là-bas quand elle se termine :
{
"id": "job_xyz789",
"status": "done",
"result": { "id": "rnd_abc", "url": "https://img.mostlyrender.com/…/rnd_abc.pdf", "output": "pdf" }
}
# Vérifier la signature
Chaque webhook porte une signature HMAC-SHA256 du corps brut dans l’en-tête x-mostlyrender-signature, préfixé sha256=. Recalculez-la avec votre secret de signature et comparez de manière 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));
}
Répondez par n’importe quel 2xx pour accuser réception. La livraison est relancée quelques fois en cas d’échec ; les cibles webhook sont gardées contre SSRF tout comme les URL de captures d’écran.