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
string
required
HMAC-SHA256 signature (base64) of the request body. Always verify this before processing.Example:
jdoe+XYZ123abc/def456GHI789==string
required
Always
application/jsonstring
Example:
TitanX-Webhooks/1.0Request Body
object
required
Job summary data.
string
required
Always
"job.completed" for this callback.number
required
Unix timestamp in milliseconds when the event occurred.Example:
1705318200000string
required
API version. Currently
"v2".string
required
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.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.