---
title: "Trigger manual webhook event to registered subscriptions"
method: POST
path: "/webhooks/test/publish"
tags: ["Webhook"]
---

# 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


**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):**

```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.

## Headers

- `tenant-id` string, required

## Request body

- ManualWebhookEventRequest — Request payload for manual webhook event triggering
  - `eventType` 'credential_workflow.status.changed' | 'facility_credential_workflow.status.changed', required
  - `eventData` JsonNode, required
    - `empty` boolean
    - `valueNode` boolean
    - `containerNode` boolean
    - `missingNode` boolean
    - `array` boolean
    - `object` boolean
    - `nodeType` 'ARRAY' | 'BINARY' | 'BOOLEAN' | 'MISSING' | 'NULL' | 'NUMBER' | 'OBJECT' | 'POJO' | 'STRING'
    - `pojo` boolean
    - `number` boolean
    - `integralNumber` boolean
    - `floatingPointNumber` boolean
    - `short` boolean
    - `int` boolean
    - `long` boolean
    - `float` boolean
    - `double` boolean
    - `bigDecimal` boolean
    - `bigInteger` boolean
    - `textual` boolean
    - `boolean` boolean
    - `null` boolean
    - `binary` boolean

## Response `200`

Successfully published webhook event to Pub/Sub

- TriggerResponse — Response for manual webhook event triggering
  - `message` string — Success message
  - `eventType` 'credential_workflow.status.changed' | 'facility_credential_workflow.status.changed'

## Other responses

- `400` — Invalid request data
- `401` — Unauthorized - Authentication required
- `403` — Forbidden - User does not have required permissions
- `500` — Internal Server Error - An unexpected error occurred

---

[API](https://skmtc.net/certifyos/apis/certify-api-layer.md) · [All operations](https://skmtc.net/certifyos/apis/certify-api-layer/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/certifyos/certify-api-layer/revisions/3d27e9019c7b/schema)
