Skip to main content

Trigger manual webhook event to registered subscriptions

POST 

/webhooks/test/publish

Triggers a manual webhook event for the specified event type. Publishes a lightweight event message to Pub/Sub. The consumer will look up active webhooks for the tenant and deliver the event to them asynchronously.

Schema Validation:

Each event type has a corresponding JSON Schema that defines the required structure for eventData. The eventData payload is validated against the schema for the specified eventType. Invalid payloads will return a 400 Bad Request with detailed validation error messages.

Supported Event Types and Schemas:

  • credential_workflow.status.changed → https://schemas.certifyos.com/webhook-events/credential-workflow-status-changed.schema.json

  • facility_credential_workflow.status.changed → https://schemas.certifyos.com/webhook-events/facility-credential-workflow-status-changed.schema.json

  • form.submission.submitted → data: { form: { id, versionId, label }, submissionId } (published by POST /forms/submissions; not schema-validated on this path yet)

  • roster_job.status.changed → roster job status-change metadata (rosterJobId, client-facing status, record counts, exportUrl); not schema-validated on this path yet

  • facility.global_termination.completed → data: { certifyFacilityId, facilityName, npi, tin, terminationDate, terminationReason, status } (published by POST /facilities/terminate; not schema-validated on this path yet)

  • practitioner.terminated → data: { certifyPractitionerId, npi, terminationType, terminationDate, terminationReason } (published by PUT /practitioners/terminate and by roster STOP rows; not schema-validated on this path yet). To re-drive real terminations rather than hand-build one here, use POST /webhooks/replay/practitioner-terminated.

What the webhook receiver will receive:

HTTP Headers:

  • Content-Type: application/json

  • User-Agent: CertifyOS-Webhook-Delivery/1.0

  • Idempotency-Key: <SHA-256 hash> - A unique key for deduplication (same key across retries)

  • Any custom headers configured in the webhook subscription

Request Body (JSON):

{
"eventType": "credential_workflow.status.changed",
"timestamp": "2024-01-20T09:15:00Z",
"data": { /* your eventData payload */ }
}

The data field contains the eventData from your request payload. The timestamp is automatically set to the current time when the event is delivered.

Example delivered body — form.submission.submitted:

{
"eventType": "form.submission.submitted",
"timestamp": "2026-04-21T06:25:51Z",
"data": {
"form": { "id": "...", "versionId": "...", "label": "practitioner" },
"submissionId": "..."
}
}

Request​

Responses​

Successfully published webhook event to Pub/Sub