Webhook endpoints are configured at the integrator environment level in the Embed Portal. You can add up to 5 endpoints per environment. Each endpoint has its own signing secret and can be enabled or disabled.
1
Navigate to Webhooks
Go to Embed Portal → Webhooks
2
Add endpoint URL
Enter your HTTPS endpoint URL
3
Copy Signing Secret
Save the webhook signing secret (whsec_*) securely
4
Test delivery
Use “Send Test Webhook” to verify connectivity and signature verification
Signature verification is the primary security mechanism and is sufficient for most integrations. The HMAC-SHA256 signature cryptographically proves each request originated from Nova.
If your security policy requires IP whitelisting in addition to signature verification, contact us through the Embed Portal to request our current webhook source IP ranges.
Note that IP ranges may change with infrastructure updates. We recommend relying on signature verification as your primary security control, with IP whitelisting as an optional additional layer.
If all 5 delivery attempts fail, automatic retries stop. However, results are never lost:
What happens
Details
Results remain accessible
Retrieve anytime via GET /v1/jobs/{jobId}/applications/{applicationId}/scoring-jobs/{scoringJobId}
No further retries
Automatic retries stop after the final attempt
Always implement a polling fallback for robustness. Check for applications stuck in “scoring” status and poll their results after a timeout (e.g., 5 minutes).
Copy
// Fallback: Poll for results if webhook wasn't receivedasync function checkPendingScores() { const stuckApplications = await db.applications.findMany({ where: { novaStatus: 'scoring', submittedAt: { lt: new Date(Date.now() - 5 * 60 * 1000) } // 5+ min ago } }); for (const app of stuckApplications) { const { scoringJob } = await nova.get( `/v1/jobs/${app.jobId}/applications/${app.applicationId}/scoring-jobs/${app.scoringJobId}` ); if (scoringJob.status === 'COMPLETED' || scoringJob.status === 'FAILED') { await processResult(scoringJob); } }}