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
- 200
- 400
- 401
- 403
- 500
Successfully published webhook event to Pub/Sub
Invalid request data
Unauthorized - Authentication required
Forbidden - User does not have required permissions
Internal Server Error - An unexpected error occurred