Overview
This documents thejob.completed webhook callback that TitanX sends to your configured endpoint once an entire job has reached its terminal state. It is a job-level bookkeeping signal — it confirms a batch is done but carries no contact data. Each contact’s scored result was already delivered to you individually, in real time, via job.contact.scored as it was scored. A job is simply an organizational grouping of contacts; job.completed plays no role in data delivery.
Related Documentation:
- Webhooks Guide - Implementation guide with code examples and event comparison
- job.contact.scored callback - Per-contact webhook event
- Webhook Management API - Endpoints to create and manage webhooks
When Does This Fire?
job.completed fires once per job when the job reaches a terminal state. This happens in one of two scenarios:
- All contacts scored — every contact in the job has been fully processed and scored (
jobStatus:"Finalized") - No contacts enriched — all contacts were rejected during enrichment, so the job is finalized as “Not Enriched” (
jobStatus:"Not Enriched")
job.contact.scored and job.completed are not alternatives. job.contact.scored is how you receive results — every contact fires its own event in real time as it is scored. job.completed delivers no contact data; use it for job-level bookkeeping, such as marking a batch complete in your UI once scoring is done.POST job.completed
TitanX sends this POST request to your configured webhook URL when a job is fully finalized.Headers
HMAC-SHA256 signature (base64) of the request body. Always verify this before processing.Example:
jdoe+XYZ123abc/def456GHI789==Always
application/jsonExample:
TitanX-Webhooks/1.0Request Body
Job summary data.
Always
"job.completed" for this callback.Unix timestamp in milliseconds when the event occurred.Example:
1705318200000API version. Currently
"v2".Unique identifier for this webhook delivery (UUID). Use this for idempotency.Example:
"7a8b9c0d-1e2f-3a4b-5c6d-7e8f9a0b1c2d"Expected Response
Your endpoint should return a 2xx status code within 10 seconds.| Status Code | Behavior |
|---|---|
200-299 | Success — no retry |
400-499 | Client error — no retry (except 408, 429) |
408, 429 | Will retry |
500-599 | Server error — will retry with exponential backoff |
Example Payload
Handling the Event
Security
All webhook requests includeX-TitanX-Signature. See Verifying Webhook Signatures for implementation examples in Node.js and Python.
OpenAPI Definition
The complete OpenAPI 3.1 specification for this webhook callback is available in the openapi.json file under thewebhooks section:
The webhook payload uses the
JobCompletedWebhookEventPayload schema defined in the OpenAPI spec. This schema is generated directly from the application’s TypeScript types to ensure the documentation always matches the actual implementation.