Kaltura Webhooks & Event Notifications API¶
Kaltura's event notification system sends real-time HTTP webhooks or emails when events occur on your content — entry uploaded, transcoding complete, metadata changed, caption added, and more. Create notification templates that define what triggers a notification, what data to send, and where to send it. Templates fire automatically when matching events occur, or manually via the dispatch action. Email notifications are delivered through the Kaltura Messaging microservice, providing SendGrid-based delivery with per-recipient tracking, engagement analytics, and CAN-SPAM compliance.
Base URL: https://www.kaltura.com/api_v3 (may differ by region/deployment)
Auth: KS passed as ks parameter in POST form data (see Session Guide)
Format: Form-encoded POST, format=1 for JSON responses
Service: eventnotification_eventnotificationtemplate (plugin service — all lowercase with plugin prefix)
1. When to Use¶
- Event-driven integrations — Trigger automated workflows in external systems (CMS, LMS, CRM) when content events occur in Kaltura, such as upload complete or transcoding finished
- Real-time notifications on content changes — Receive immediate HTTP callbacks when entries are created, updated, or deleted, enabling responsive dashboards and audit logs
- Workflow automation triggers — Chain Kaltura events to downstream processing steps like caption ordering, distribution publishing, or compliance review without polling the API
2. Prerequisites¶
- A Kaltura account with the Event Notification plugin enabled (contact your Kaltura account manager if
eventNotificationTemplateactions returnSERVICE_FORBIDDEN) - An ADMIN KS (type=2) with
disableentitlementprivilege for full template management - For HTTP webhooks: an HTTPS endpoint to receive POST callbacks
- For email notifications: valid sender/recipient email addresses (delivery via the Messaging Service)
3. Quick Start — Your First Webhook in 2 Steps¶
The fastest way to get a working webhook: clone a system template and point it at your URL.
Step 1 — Find a system template to clone:
curl -X POST "$KALTURA_SERVICE_URL/service/eventnotification_eventnotificationtemplate/action/listTemplates" \
-d "ks=$KALTURA_KS" \
-d "format=1" \
-d "filter[objectType]=KalturaEventNotificationTemplateFilter" \
-d "filter[typeEqual]=httpNotification.Http"
Pick the template matching your use case (e.g., "Entry Status Changed" for entry events). Note its id.
Step 2 — Clone it with your URL and configuration:
curl -X POST "$KALTURA_SERVICE_URL/service/eventnotification_eventnotificationtemplate/action/clone" \
-d "ks=$KALTURA_KS" \
-d "format=1" \
-d "id=$SYSTEM_TEMPLATE_ID" \
-d "eventNotificationTemplate[objectType]=KalturaHttpNotificationTemplate" \
-d "eventNotificationTemplate[name]=My Webhook" \
-d "eventNotificationTemplate[systemName]=MY_WEBHOOK" \
-d "eventNotificationTemplate[url]=https://myapp.example.com/webhooks/kaltura" \
-d "eventNotificationTemplate[method]=2" \
-d "eventNotificationTemplate[data][objectType]=KalturaHttpNotificationObjectData" \
-d "eventNotificationTemplate[data][format]=1" \
-d "eventNotificationTemplate[data][apiObjectType]=KalturaBaseEntry" \
-d "eventNotificationTemplate[signSecret]=my-secret-key" \
-d "eventNotificationTemplate[secureHashingAlgo]=2"
The clone creates the template in DISABLED status. Activate it:
curl -X POST "$KALTURA_SERVICE_URL/service/eventnotification_eventnotificationtemplate/action/updateStatus" \
-d "ks=$KALTURA_KS" \
-d "format=1" \
-d "id=$TEMPLATE_ID" \
-d "status=2"
That's it. Your endpoint will now receive JSON POST requests whenever the matching event occurs. The payload is a KalturaHttpNotification object containing the full entry data. Verify the X-KALTURA-SIGNATURE header against SHA256(signing_secret + raw_body) to authenticate requests.
For email notifications, see section 10. For advanced conditions (fire only on specific field changes), see section 7.3.
4. Core Concepts¶
4.1 Template Types¶
Each notification template has a type string that determines its delivery channel:
| Type Value | Object Type | Description |
|---|---|---|
httpNotification.Http |
KalturaHttpNotificationTemplate |
Send an HTTP POST/GET to a URL when an event occurs |
emailNotification.Email |
KalturaEmailNotificationTemplate |
Send an email when an event occurs (delivered via the Messaging Service) |
Use the string value (e.g., httpNotification.Http) when filtering by type. The system also supports additional notification types: Boolean templates define reusable conditions for REACH automation rules, while Push and Kafka templates are used internally by Kaltura platform services.
4.2 Event Types¶
Events that can trigger a notification (integer IDs):
| Event Type | ID | Description |
|---|---|---|
| OBJECT_ADDED | 1 | A new object was created |
| OBJECT_CHANGED | 2 | An object was modified |
| OBJECT_COPIED | 3 | An object was copied |
| OBJECT_CREATED | 5 | An object was fully created (post-processing complete) |
| OBJECT_DATA_CHANGED | 6 | An object's associated data changed |
| OBJECT_DELETED | 7 | An object was deleted |
| OBJECT_ERASED | 10 | An object was permanently erased |
| OBJECT_READY_FOR_REPLACMENT | 11 | An object is ready for content replacement |
| OBJECT_READY_FOR_INDEX | 12 | An object is ready for search indexing |
Plugin-contributed event types use string IDs (e.g., integrationEventNotifications.INTEGRATION_JOB_CLOSED).
4.3 Event Object Types¶
The type of Kaltura object that triggers the event:
| Object Type | ID | Description |
|---|---|---|
| ENTRY | 1 | Media entries (video, audio, image, document) |
| CATEGORY | 2 | Content categories |
| ASSET | 3 | Generic assets |
| FLAVORASSET | 4 | Transcoded video flavors |
| THUMBASSET | 5 | Thumbnail assets |
| KUSER | 8 | Users |
| ACCESSCONTROL | 9 | Access control profiles |
| BATCHJOB | 10 | Batch processing jobs |
| BULKUPLOADRESULT | 11 | Bulk upload results |
| CATEGORYKUSER | 12 | Category-user assignments |
| CONVERSIONPROFILE2 | 14 | Conversion profiles |
| FLAVORPARAMS | 15 | Flavor parameters |
| PERMISSION | 18 | Permissions |
| ROLE | 20 | User roles |
| USERLOGINDATA | 22 | Login data |
| LIVE_STREAM | 38 | Live stream entries |
| SERVER_NODE | 39 | Server nodes |
| ENTRY_VENDOR_TASK | 42 | REACH enrichment service tasks (captions, translations, moderation, and more) |
Plugin-contributed object types use string IDs (available when the corresponding plugin is enabled):
| Object Type | String ID | Description |
|---|---|---|
| Metadata | metadataEventNotifications.Metadata |
Custom metadata records |
| CuePoint | cuePointEventNotifications.CuePoint |
In-video cue points |
| Annotation | annotationEventNotifications.Annotation |
Annotation cue points |
| CaptionAsset | captionAssetEventNotifications.CaptionAsset |
Caption/subtitle files |
| TranscriptAsset | transcriptAssetEventNotifications.TranscriptAsset |
Transcript files |
| AttachmentAsset | attachmentAssetEventNotifications.AttachmentAsset |
Attachment files |
| ScheduleEvent | scheduleEventNotifications.ScheduleEvent |
Scheduled events |
| VirtualEvent | virtualEventEventNotifications.VirtualEvent |
Virtual events |
| DropFolder | dropFolderEventNotifications.DropFolder |
Drop folders |
| DropFolderFile | dropFolderEventNotifications.DropFolderFile |
Drop folder files |
| EntryDistribution | contentDistributionEventNotifications.EntryDistribution |
Content distribution records |
| AdCuePoint | adCuePointEventNotifications.AdCuePoint |
Ad cue points |
4.4 Template Status¶
| Status | ID | Description |
|---|---|---|
| DISABLED | 1 | Template exists but does not fire |
| ACTIVE | 2 | Template fires on matching events |
Status is read-only on the template object. Use the updateStatus action to change it (see section 11.4). Deleting a template is a hard delete — the template is permanently removed and no longer retrievable via get.
4.5 Automatic vs Manual Dispatch¶
- Automatic dispatch: The template fires whenever a matching event occurs (based on
eventType,eventObjectType, and optionaleventConditions). This is the default behavior for active templates. - Manual dispatch: Call the
dispatchaction to fire a template on demand for a specific object, regardless of whether the event occurred naturally.
5. Discover System Templates¶
Kaltura provides pre-built system templates (owned by partner 0) that cover common notification scenarios. Use listTemplates to discover them, then clone to create your own copy.
5.1 List System Templates¶
curl -X POST "$KALTURA_SERVICE_URL/service/eventnotification_eventnotificationtemplate/action/listTemplates" \
-d "ks=$KALTURA_KS" \
-d "format=1"
Response:
{
"totalCount": 15,
"objects": [
{
"id": 1234,
"name": "Entry Ready",
"systemName": "ENTRY_READY",
"type": 1,
"status": 1,
"objectType": "KalturaHttpNotificationTemplate"
}
]
}
Returns all system templates available for cloning. Each template includes id, name, description, type, eventType, and eventObjectType.
5.2 List with Filtering¶
Filter system templates by type or event:
curl -X POST "$KALTURA_SERVICE_URL/service/eventnotification_eventnotificationtemplate/action/listTemplates" \
-d "ks=$KALTURA_KS" \
-d "format=1" \
-d "filter[objectType]=KalturaEventNotificationTemplateFilter" \
-d "filter[typeEqual]=httpNotification.Http" \
-d "filter[orderBy]=-createdAt"
| Filter Field | Description |
|---|---|
typeEqual |
Template type string (e.g., httpNotification.Http, emailNotification.Email) |
statusEqual |
Template status (1=disabled, 2=active, 3=deleted) |
eventTypeEqual |
Event type ID |
objectType |
Always KalturaEventNotificationTemplateFilter |
orderBy |
Sort field (prefix - for descending): +createdAt, -createdAt, +updatedAt, -updatedAt, +id, -id |
Pager¶
6. Clone a System Template¶
The recommended way to create notification templates is to clone an existing system template and customize it. This inherits the correct event type, object type, and condition structure.
curl -X POST "$KALTURA_SERVICE_URL/service/eventnotification_eventnotificationtemplate/action/clone" \
-d "ks=$KALTURA_KS" \
-d "format=1" \
-d "id=$SYSTEM_TEMPLATE_ID" \
-d "eventNotificationTemplate[objectType]=KalturaHttpNotificationTemplate" \
-d "eventNotificationTemplate[name]=My Entry Ready Webhook" \
-d "eventNotificationTemplate[systemName]=MY_ENTRY_READY" \
-d "eventNotificationTemplate[url]=https://example.com/webhooks/kaltura" \
-d "eventNotificationTemplate[method]=2"
Cloned templates are created in DISABLED status. Activate with updateStatus:
curl -X POST "$KALTURA_SERVICE_URL/service/eventnotification_eventnotificationtemplate/action/updateStatus" \
-d "ks=$KALTURA_KS" \
-d "format=1" \
-d "id=$TEMPLATE_ID" \
-d "status=2"
| Parameter | Type | Required | Description |
|---|---|---|---|
id |
integer | Yes | System template ID to clone from |
eventNotificationTemplate[objectType] |
string | Yes | KalturaHttpNotificationTemplate or KalturaEmailNotificationTemplate |
eventNotificationTemplate[name] |
string | No | Override the template name |
eventNotificationTemplate[systemName] |
string | No | Unique system name (required if the source template has one) |
eventNotificationTemplate[url] |
string | No | Webhook URL (HTTP templates) |
eventNotificationTemplate[method] |
integer | No | HTTP method: 1=GET, 2=POST |
Response (clone):
{
"id": 26970301,
"partnerId": 123456,
"name": "My Entry Ready Webhook",
"systemName": "ENTRY_READY",
"description": "Fires when an entry changes status",
"type": "httpNotification.Http",
"status": 2,
"createdAt": 1718400000,
"updatedAt": 1718400000,
"eventType": 2,
"eventObjectType": "1",
"objectType": "KalturaHttpNotificationTemplate"
}
The cloned template gets a new id owned by your partner account. The original system template remains unchanged.
7. Create an HTTP Webhook Template¶
Create a template from scratch (instead of cloning) when you need full control over every field. The add action requires higher privileges than clone — some accounts can only use clone. Prefer cloning system templates (section 6) for most use cases.
curl -X POST "$KALTURA_SERVICE_URL/service/eventnotification_eventnotificationtemplate/action/add" \
-d "ks=$KALTURA_KS" \
-d "format=1" \
-d "eventNotificationTemplate[objectType]=KalturaHttpNotificationTemplate" \
-d "eventNotificationTemplate[name]=Entry Ready Webhook" \
-d "eventNotificationTemplate[description]=Fires when any entry reaches READY status" \
-d "eventNotificationTemplate[eventType]=2" \
-d "eventNotificationTemplate[eventObjectType]=1" \
-d "eventNotificationTemplate[url]=https://example.com/webhooks/kaltura" \
-d "eventNotificationTemplate[method]=2" \
-d "eventNotificationTemplate[contentType]=2"
Templates are created in DISABLED status. Activate with updateStatus (see section 11.4) after verifying the configuration.
| Parameter | Type | Required | Description |
|---|---|---|---|
eventNotificationTemplate[objectType] |
string | Yes | KalturaHttpNotificationTemplate |
eventNotificationTemplate[name] |
string | Yes | Template display name |
eventNotificationTemplate[eventType] |
integer | Yes | Event type ID (see section 4.2) |
eventNotificationTemplate[eventObjectType] |
integer/string | Yes | Object type that triggers the event (see section 4.3) |
eventNotificationTemplate[url] |
string | Yes | HTTPS endpoint URL to receive webhook POSTs |
eventNotificationTemplate[method] |
integer | Yes | HTTP method: 1=GET, 2=POST |
eventNotificationTemplate[description] |
string | No | Human-readable template description |
eventNotificationTemplate[contentType] |
integer | No | Body content type: 1=form-encoded, 2=JSON, 3=XML, 4=text (default: 1) |
eventNotificationTemplate[signSecret] |
string | No | HMAC signing secret for webhook verification (see section 8) |
eventNotificationTemplate[secureHashingAlgo] |
integer | No | Hash algorithm: 1=SHA1, 2=SHA256, 3=SHA384, 4=SHA512, 5=MD5 |
eventNotificationTemplate[authUsername] |
string | No | HTTP Basic Auth username |
eventNotificationTemplate[authPassword] |
string | No | HTTP Basic Auth password |
eventNotificationTemplate[customHeaders] |
array | No | Custom HTTP headers (see section 7.4) |
eventNotificationTemplate[eventConditions] |
array | No | Conditions to filter when the template fires (see section 7.3) |
7.1 HTTP Template Fields¶
| Field | Type | Description |
|---|---|---|
objectType |
string | KalturaHttpNotificationTemplate |
name |
string | Template display name |
description |
string | Template description |
eventType |
integer | Event type ID (see section 4.2) |
eventObjectType |
integer/string | Object type (see section 4.3) |
url |
string | Webhook endpoint URL (supports {placeholder} tokens from userParameters) |
method |
integer | 1=GET, 2=POST |
contentType |
integer | 1=application/x-www-form-urlencoded, 2=application/json, 3=application/xml, 4=text/plain |
data[objectType] |
string | Payload type (see section 9.4) |
customHeaders |
array | Custom HTTP headers (see section 7.4) |
authUsername |
string | HTTP authentication username (write-only — not returned in GET) |
authPassword |
string | HTTP authentication password (write-only — not returned in GET) |
authenticationMethod |
integer | HTTP auth method: 1=BASIC, 2=DIGEST, 4=GSSNEGOTIATE, 8=NTLM, 16=ANY (default: 1) |
sslVersion |
integer | SSL/TLS version |
sslCertificate |
string | Client SSL certificate |
sslCertificateType |
string | Certificate type (PEM, DER) |
sslCertificatePassword |
string | Certificate password |
sslKey |
string | SSL key |
sslKeyType |
string | Key type |
sslKeyPassword |
string | Key password |
signSecret |
string | HMAC signing secret (see section 8) |
secureHashingAlgo |
integer | HMAC hash algorithm: 1=SHA1, 2=SHA256, 3=SHA384, 4=SHA512, 5=MD5 |
eventDelayedCondition |
integer | 1=delay dispatch until entry reaches READY status (see section 7.6) |
userParameters |
array | Template-level custom parameters with {placeholder} substitution (see section 7.8) |
contentParameters |
array | System-evaluated dynamic parameters resolved at dispatch time (see section 7.9) |
status |
integer | 1=disabled, 2=active (read-only — use updateStatus action to change) |
7.2 Payload Data Configuration¶
System templates have no payload data configured by default — the webhook fires but sends an empty body. Configure payload data on your cloned template to include event data. See section 9.4 for the available data types (KalturaHttpNotificationObjectData, KalturaHttpNotificationDataFields) and configuration examples.
7.3 Event Conditions¶
Add conditions to control when a template fires. Conditions filter events beyond just the event type and object type.
Which Condition Type Do I Need?¶
| I want to fire when... | Use this condition |
|---|---|
| A field has a specific value (e.g., status=READY) | KalturaEventFieldCondition |
| A custom metadata field changes between versions | KalturaMetadataFieldChangedCondition |
| Specific database columns were modified | KalturaEventObjectChangedCondition |
| Other boolean templates all evaluate true | KalturaBooleanEventNotificationCondition |
Multiple conditions on the same template are ANDed — all must be true for the notification to fire.
Field-Value Condition (KalturaEventFieldCondition)¶
Fire only when a specific field has a specific value at the time of the event:
-d "eventNotificationTemplate[eventConditions][0][objectType]=KalturaEventFieldCondition" \
-d "eventNotificationTemplate[eventConditions][0][description]=Only when entry is READY" \
-d "eventNotificationTemplate[eventConditions][0][field][objectType]=KalturaEvalBooleanField" \
-d "eventNotificationTemplate[eventConditions][0][field][code]=in_array({event.object.status},array(2))"
This condition fires only when the object's status is 2 (READY). The code field uses PHP expressions with {event.object.fieldName} placeholders.
Metadata Field Changed Condition (KalturaMetadataFieldChangedCondition)¶
Fire when a specific field in a custom metadata profile changes between versions:
-d "eventNotificationTemplate[eventConditions][0][objectType]=KalturaMetadataFieldChangedCondition" \
-d "eventNotificationTemplate[eventConditions][0][xPath]=/metadata/ApprovalStatus" \
-d "eventNotificationTemplate[eventConditions][0][profileSystemName]=Content_Workflow" \
-d "eventNotificationTemplate[eventConditions][0][versionA]=-1" \
-d "eventNotificationTemplate[eventConditions][0][versionB]=0"
| Field | Type | Description |
|---|---|---|
xPath |
string | XPath to the metadata field (e.g., /metadata/ApprovalStatus) |
profileSystemName |
string | System name of the metadata profile |
versionA |
string | Previous version to compare (-1 = previous version) |
versionB |
string | Current version to compare (0 = current version) |
Use this when you need to trigger a webhook specifically when a metadata field value transitions — for example, when an approval status changes from "pending" to "approved" in a custom workflow.
Object Changed Condition (KalturaEventObjectChangedCondition)¶
Fire only when specific database columns on the object have changed:
-d "eventNotificationTemplate[eventConditions][0][objectType]=KalturaEventObjectChangedCondition" \
-d "eventNotificationTemplate[eventConditions][0][modifiedColumns]=name,description,tags"
| Field | Type | Description |
|---|---|---|
modifiedColumns |
string | Comma-separated list of database column names that must have changed |
Use this with eventType=2 (OBJECT_CHANGED) to fire only when specific fields change, rather than any update.
Boolean Condition (KalturaBooleanEventNotificationCondition)¶
Reference other Boolean notification templates as reusable conditions:
-d "eventNotificationTemplate[eventConditions][0][objectType]=KalturaBooleanEventNotificationCondition" \
-d "eventNotificationTemplate[eventConditions][0][booleanEventNotificationIds]=101,102"
Boolean templates evaluate without dispatching — they return true/false. Reference them here to compose complex conditions from reusable building blocks. All referenced boolean templates must evaluate to true for the notification to fire.
7.4 Custom Headers¶
Add custom HTTP headers to webhook requests:
-d "eventNotificationTemplate[customHeaders][0][objectType]=KalturaKeyValue" \
-d "eventNotificationTemplate[customHeaders][0][key]=X-Custom-Header" \
-d "eventNotificationTemplate[customHeaders][0][value]=my-value"
7.5 HTTP Authentication¶
Configure HTTP authentication for webhook endpoints that require credentials:
curl -X POST "$KALTURA_SERVICE_URL/service/eventnotification_eventnotificationtemplate/action/update" \
-d "ks=$KALTURA_KS" \
-d "format=1" \
-d "id=$TEMPLATE_ID" \
-d "eventNotificationTemplate[objectType]=KalturaHttpNotificationTemplate" \
-d "eventNotificationTemplate[authUsername]=webhook-user" \
-d "eventNotificationTemplate[authPassword]=secret-password" \
-d "eventNotificationTemplate[authenticationMethod]=1"
authenticationMethod Value |
Method |
|---|---|
| 1 | HTTP Basic (default) |
| 2 | HTTP Digest |
| 4 | GSS-Negotiate |
| 8 | NTLM |
| 16 | Any (server-negotiated) |
When authentication is configured, Kaltura sends the credentials with each webhook dispatch request using the specified authentication method. The authUsername and authPassword fields are write-only — they are accepted by the API but not returned in GET responses (similar to signSecret).
7.6 Delayed Dispatch (eventDelayedCondition)¶
Delay notification dispatch until the entry reaches READY status. This is a native template-level flag — distinct from event conditions:
When set to 1, the system holds the notification until the entry's status becomes 2 (READY), then dispatches. Use this to avoid receiving webhooks for entries that are still processing.
Alternatively, achieve similar behavior with a field condition (useful when you need custom status checks):
-d "eventNotificationTemplate[eventConditions][0][objectType]=KalturaEventFieldCondition" \
-d "eventNotificationTemplate[eventConditions][0][description]=Dispatch only when entry is READY" \
-d "eventNotificationTemplate[eventConditions][0][field][objectType]=KalturaEvalBooleanField" \
-d "eventNotificationTemplate[eventConditions][0][field][code]={event.object.status}==2"
7.7 Parameters and Payload Data — Choosing the Right Approach¶
Three mechanisms control what data is included in a webhook or email. They solve different problems:
| Mechanism | Purpose | Resolved when | Use for |
|---|---|---|---|
data (section 9.4) |
Controls the HTTP POST body content | Dispatch time | Sending the full event object or specific field values in the webhook body |
contentParameters (section 7.9) |
Provides dynamic tokens like {entry_id} |
Dispatch time (system-evaluated) | Email subject/body tokens, DataText placeholders |
userParameters (section 7.8) |
Provides static tokens like {callback_url} |
Dispatch time (template-stored) | Making templates reusable — configure once, reference in URL/conditions |
Decision guide:
- Want the webhook body to contain the entry object as JSON? → Use data with KalturaHttpNotificationObjectData
- Want {entry_name} tokens in your email body? → Use contentParameters (section 7.9) with KalturaEvalStringField
- Want to parameterize your webhook URL or conditions? → Use userParameters (section 7.8) with KalturaStringValue
- Want a custom text body with tokens? → Use data with KalturaHttpNotificationDataText + contentParameters
7.8 User Parameters (Template-Level Custom Parameters)¶
User parameters are custom name/value pairs defined on the template. Their {placeholder} tokens are substituted in URL, conditions, and other fields at dispatch time. Use them to make templates reusable across different scenarios.
curl -X POST "$KALTURA_SERVICE_URL/service/eventnotification_eventnotificationtemplate/action/update" \
-d "ks=$KALTURA_KS" \
-d "format=1" \
-d "id=$TEMPLATE_ID" \
-d "eventNotificationTemplate[objectType]=KalturaHttpNotificationTemplate" \
-d "eventNotificationTemplate[userParameters][0][objectType]=KalturaEventNotificationParameter" \
-d "eventNotificationTemplate[userParameters][0][key]=metadata_field" \
-d "eventNotificationTemplate[userParameters][0][value][objectType]=KalturaStringValue" \
-d "eventNotificationTemplate[userParameters][0][value][value]=ApprovalStatus" \
-d "eventNotificationTemplate[userParameters][1][objectType]=KalturaEventNotificationParameter" \
-d "eventNotificationTemplate[userParameters][1][key]=metadata_profile" \
-d "eventNotificationTemplate[userParameters][1][value][objectType]=KalturaStringValue" \
-d "eventNotificationTemplate[userParameters][1][value][value]=Content_Workflow" \
-d "eventNotificationTemplate[userParameters][2][objectType]=KalturaEventNotificationParameter" \
-d "eventNotificationTemplate[userParameters][2][key]=callback_url" \
-d "eventNotificationTemplate[userParameters][2][value][objectType]=KalturaStringValue" \
-d "eventNotificationTemplate[userParameters][2][value][value]=https://myapp.example.com/hooks/approval"
| Field | Type | Description |
|---|---|---|
key |
string | Parameter name — referenced as {key} in URL, conditions, and other template fields |
value[objectType] |
string | KalturaStringValue for static values |
value[value] |
string | The parameter value |
description |
string | Optional human-readable description |
User parameters are stored on the template and resolved at dispatch time. Reference them in the template URL: https://myapp.example.com/hooks/{callback_url} or in metadata conditions as {metadata_field}.
7.9 Content Parameters (System-Evaluated Dynamic Parameters)¶
Content parameters are resolved by the system at dispatch time from the event context. They provide dynamic values like entry names, IDs, and user details based on the triggering event.
curl -X POST "$KALTURA_SERVICE_URL/service/eventnotification_eventnotificationtemplate/action/update" \
-d "ks=$KALTURA_KS" \
-d "format=1" \
-d "id=$TEMPLATE_ID" \
-d "eventNotificationTemplate[objectType]=KalturaHttpNotificationTemplate" \
-d "eventNotificationTemplate[contentParameters][0][objectType]=KalturaEventNotificationParameter" \
-d "eventNotificationTemplate[contentParameters][0][key]=entry_id" \
-d "eventNotificationTemplate[contentParameters][0][value][objectType]=KalturaEvalStringField" \
-d "eventNotificationTemplate[contentParameters][0][value][code]={event.object.id}" \
-d "eventNotificationTemplate[contentParameters][1][objectType]=KalturaEventNotificationParameter" \
-d "eventNotificationTemplate[contentParameters][1][key]=entry_name" \
-d "eventNotificationTemplate[contentParameters][1][value][objectType]=KalturaEvalStringField" \
-d "eventNotificationTemplate[contentParameters][1][value][code]={event.object.name}" \
-d "eventNotificationTemplate[contentParameters][2][objectType]=KalturaEventNotificationParameter" \
-d "eventNotificationTemplate[contentParameters][2][key]=owner_id" \
-d "eventNotificationTemplate[contentParameters][2][value][objectType]=KalturaEvalStringField" \
-d "eventNotificationTemplate[contentParameters][2][value][code]={event.object.userId}"
| Value Object Type | Description |
|---|---|
KalturaEvalStringField |
Evaluates a PHP expression with {event.object.*} placeholders |
KalturaStringField |
Returns a static string value |
Common {event.object.*} fields for entries: id, name, description, userId, creatorId, tags, categories, status, mediaType, duration, createdAt, updatedAt.
Content parameters are referenced in email subject/body as {key} (e.g., {entry_id}, {entry_name}) and in HTTP payload data fields.
8. Webhook Signing (HMAC Verification)¶
Secure your webhook endpoint by verifying that requests come from Kaltura using HMAC signing.
8.1 Configure Signing¶
Set a signing secret and hash algorithm on the template:
curl -X POST "$KALTURA_SERVICE_URL/service/eventnotification_eventnotificationtemplate/action/update" \
-d "ks=$KALTURA_KS" \
-d "format=1" \
-d "id=$TEMPLATE_ID" \
-d "eventNotificationTemplate[objectType]=KalturaHttpNotificationTemplate" \
-d "eventNotificationTemplate[signSecret]=your-webhook-secret-key" \
-d "eventNotificationTemplate[secureHashingAlgo]=2"
| Field | Description |
|---|---|
signSecret |
Your shared secret for HMAC computation |
secureHashingAlgo |
Hash algorithm integer: 1=SHA1, 2=SHA256, 3=SHA384, 4=SHA512, 5=MD5 |
8.2 Verification Headers¶
Kaltura sends two additional headers with each webhook request:
| Header | Value |
|---|---|
X-KALTURA-SIGNATURE |
SHA256(signing_secret + raw_body) — hex-encoded |
X-KALTURA-HASH-ALGO |
The hash algorithm used (e.g., sha256) |
The signing key is your signSecret if configured, otherwise Kaltura uses your partner's admin secret as the default signing key. The signSecret field is write-only — it is never returned in API responses.
8.3 Verify on Your Server¶
The signature is a SHA256 hash of the signing secret concatenated with the raw POST body (not HMAC — plain concatenation):
# Verify webhook signature
EXPECTED=$(echo -n "${SIGNING_SECRET}${RAW_BODY}" | sha256sum | cut -d' ' -f1)
# Compare $EXPECTED with the X-KALTURA-SIGNATURE header value
9. Webhook Payload Structure (Verified via Live Delivery)¶
9.1 HTTP Notification Wrapper¶
The webhook POST body contains a JSON-serialized KalturaHttpNotification object. This structure has been verified by capturing actual webhook deliveries:
| Field | Type | Description |
|---|---|---|
objectType |
string | Always KalturaHttpNotification |
object |
object | The Kaltura API object that triggered the event |
eventObjectType |
integer | Object type identifier (e.g., 1=ENTRY) |
eventType |
integer | Event type ID (e.g., 3=OBJECT_COPIED) |
templateId |
integer | The notification template ID that fired |
templateName |
string | Template display name |
templateSystemName |
string | Template system name |
eventNotificationJobId |
integer | Unique job ID for tracking this dispatch |
9.2 HTTP Headers¶
Kaltura sends these headers with each webhook request:
| Header | Example Value | Description |
|---|---|---|
Content-Type |
application/json |
JSON when using KalturaHttpNotificationObjectData with format=1 |
X-KALTURA-SIGNATURE |
d6b864... |
SHA256(signing_secret + body) hex digest |
X-KALTURA-HASH-ALGO |
sha256 |
Hash algorithm used for signature |
User-Agent |
Mozilla/5.0 ... |
Kaltura's outgoing User-Agent string |
9.3 Example Payload (Verified)¶
Captured from a live webhook delivery triggered by creating an entry:
{
"object": {
"objectType": "KalturaBaseEntry"
},
"eventObjectType": 1,
"eventNotificationJobId": 33578094492,
"templateId": 26970222,
"templateName": "Entry Ready Webhook",
"templateSystemName": "ENTRY_READY",
"eventType": 3,
"objectType": "KalturaHttpNotification"
}
9.4 Configuring Payload Data¶
System templates have no payload data configured by default — the webhook fires with an empty body. Configure what data to include using the data field on the template.
KalturaHttpNotificationObjectData (recommended)¶
Sends the event object as structured JSON:
curl -X POST "$KALTURA_SERVICE_URL/service/eventnotification_eventnotificationtemplate/action/update" \
-d "ks=$KALTURA_KS" \
-d "format=1" \
-d "id=$TEMPLATE_ID" \
-d "eventNotificationTemplate[objectType]=KalturaHttpNotificationTemplate" \
-d "eventNotificationTemplate[data][objectType]=KalturaHttpNotificationObjectData" \
-d "eventNotificationTemplate[data][format]=1" \
-d "eventNotificationTemplate[data][apiObjectType]=KalturaBaseEntry"
| Field | Type | Description |
|---|---|---|
format |
integer | 1=JSON, 2=XML, 3=PHP serialized |
apiObjectType |
string | Kaltura object type to serialize (e.g., KalturaBaseEntry, KalturaMediaEntry) |
responseProfileId |
integer | Response profile to control which object fields are included |
The object field in the payload contains the API object. To get all entry fields, use a response profile or do a follow-up media.get call using the entry ID from the event context.
KalturaHttpNotificationDataText¶
Sends a custom text body with content parameter placeholders:
-d "eventNotificationTemplate[data][objectType]=KalturaHttpNotificationDataText" \
-d "eventNotificationTemplate[data][content][objectType]=KalturaStringValue" \
-d "eventNotificationTemplate[data][content][value]=Entry {entry_id} ({entry_name}) is now ready. Owner: {owner_id}"
The text body resolves {placeholder} tokens from the template's content parameters at dispatch time.
KalturaHttpNotificationDataFields¶
Sends specific fields as key-value pairs in the POST body:
-d "eventNotificationTemplate[data][objectType]=KalturaHttpNotificationDataFields" \
-d "eventNotificationTemplate[data][fields][0][objectType]=KalturaEventNotificationParameter" \
-d "eventNotificationTemplate[data][fields][0][key]=entryId" \
-d "eventNotificationTemplate[data][fields][0][value][objectType]=KalturaEvalStringField" \
-d "eventNotificationTemplate[data][fields][0][value][code]={event.object.id}" \
-d "eventNotificationTemplate[data][fields][1][objectType]=KalturaEventNotificationParameter" \
-d "eventNotificationTemplate[data][fields][1][key]=status" \
-d "eventNotificationTemplate[data][fields][1][value][objectType]=KalturaEvalStringField" \
-d "eventNotificationTemplate[data][fields][1][value][code]={event.object.status}"
Each field is a KalturaEventNotificationParameter with a key and a value evaluated at dispatch time. The result is sent as form-encoded key-value pairs in the webhook body.
9.5 Delivery Characteristics¶
| Property | Observed Value |
|---|---|
| Delivery latency | ~5-15 seconds after event |
| Source IPs | Kaltura server IPs (e.g., 192.58.252.101) |
| Default body (no data config) | Empty POST, application/x-www-form-urlencoded |
| With ObjectData config | JSON body, application/json |
| Retry behavior | Up to 10 retries with exponential backoff over ~24 hours on HTTP 5xx or timeout |
10. Email Notifications via the Messaging Service¶
Email event notifications combine the event notification framework's trigger engine with the Kaltura Messaging microservice for delivery. The event notification template defines when to send (event type, object type, conditions) and what to include (subject, body, content parameters). The Messaging service handles how to deliver — SendGrid-based email dispatch with per-recipient tracking, engagement analytics, and CAN-SPAM compliance.
10.1 Architecture¶
The dispatch flow has two layers:
- Trigger layer (Event Notification Template) — evaluates
eventType+eventObjectTypefilters andeventConditions, resolves recipients from the provider configuration - Delivery layer (Messaging Service at
messaging.nvp1.ovp.kaltura.com) — resolves template tokens, dispatches via SendGrid, tracks delivery and engagement per-recipient
When an event matches a template's conditions, the notification dispatch engine routes the email through the Messaging API, which handles template resolution, SendGrid delivery, per-recipient tracking, and CAN-SPAM compliance.
10.2 Create an Email Notification Template¶
curl -X POST "$KALTURA_SERVICE_URL/service/eventnotification_eventnotificationtemplate/action/add" \
-d "ks=$KALTURA_KS" \
-d "format=1" \
-d "eventNotificationTemplate[objectType]=KalturaEmailNotificationTemplate" \
-d "eventNotificationTemplate[name]=Entry Ready Email Alert" \
-d "eventNotificationTemplate[eventType]=2" \
-d "eventNotificationTemplate[eventObjectType]=1" \
-d "eventNotificationTemplate[format]=1" \
-d "eventNotificationTemplate[subject]=Entry {entry_id} is ready" \
-d "eventNotificationTemplate[body]=Entry {entry_id} ({entry_name}) has finished processing and is ready for playback." \
-d "eventNotificationTemplate[fromEmail]=notifications@example.com" \
-d "eventNotificationTemplate[fromName]=Kaltura Notifications" \
-d "eventNotificationTemplate[to][objectType]=KalturaEmailNotificationStaticRecipientProvider" \
-d "eventNotificationTemplate[to][emailRecipients][0][objectType]=KalturaEmailNotificationRecipient" \
-d "eventNotificationTemplate[to][emailRecipients][0][email][objectType]=KalturaStringValue" \
-d "eventNotificationTemplate[to][emailRecipients][0][email][value]=admin@example.com" \
-d "eventNotificationTemplate[to][emailRecipients][0][name][objectType]=KalturaStringValue" \
-d "eventNotificationTemplate[to][emailRecipients][0][name][value]=Admin" \
-d "eventNotificationTemplate[status]=1"
| Parameter | Type | Required | Description |
|---|---|---|---|
eventNotificationTemplate[objectType] |
string | Yes | KalturaEmailNotificationTemplate |
eventNotificationTemplate[name] |
string | Yes | Template display name |
eventNotificationTemplate[eventType] |
integer | Yes | Event type ID (see section 4.2) |
eventNotificationTemplate[eventObjectType] |
integer/string | Yes | Object type that triggers the event (see section 4.3) |
eventNotificationTemplate[subject] |
string | Yes | Email subject line (supports content parameters — see section 10.5) |
eventNotificationTemplate[body] |
string | Yes | Email body (supports content parameters and HTML when format=1) |
eventNotificationTemplate[to] |
object | Yes | Recipient provider — static, entry owner, category, or group (see section 10.4) |
eventNotificationTemplate[format] |
integer | No | Email format: 1=HTML, 2=plain text, 3=both (default: 1) |
eventNotificationTemplate[fromEmail] |
string | No | Sender email address (default: partner-configured sender) |
eventNotificationTemplate[fromName] |
string | No | Sender display name |
eventNotificationTemplate[cc] |
object | No | CC recipient provider (same structure as to) |
eventNotificationTemplate[bcc] |
object | No | BCC recipient provider (same structure as to) |
eventNotificationTemplate[status] |
integer | No | 1=disabled, 2=active (default: 1 disabled) |
eventNotificationTemplate[eventConditions] |
array | No | Conditions to filter when the template fires (see section 7.3) |
10.3 Email Template Fields¶
| Field | Type | Description |
|---|---|---|
objectType |
string | KalturaEmailNotificationTemplate |
format |
integer | 1=HTML, 2=plain text, 3=both |
subject |
string | Email subject (supports content parameters) |
body |
string | Email body (supports content parameters) |
fromEmail |
string | Sender email address |
fromName |
string | Sender display name |
to |
object | Recipient provider (see section 10.4) |
cc |
object | CC recipient provider |
bcc |
object | BCC recipient provider |
status |
integer | 1=disabled, 2=active |
10.4 Recipient Provider Types¶
Static Recipients¶
Send to fixed email addresses:
-d "eventNotificationTemplate[to][objectType]=KalturaEmailNotificationStaticRecipientProvider" \
-d "eventNotificationTemplate[to][emailRecipients][0][objectType]=KalturaEmailNotificationRecipient" \
-d "eventNotificationTemplate[to][emailRecipients][0][email][objectType]=KalturaStringValue" \
-d "eventNotificationTemplate[to][emailRecipients][0][email][value]=admin@example.com" \
-d "eventNotificationTemplate[to][emailRecipients][0][name][objectType]=KalturaStringValue" \
-d "eventNotificationTemplate[to][emailRecipients][0][name][value]=Admin User"
Entry Owner¶
Send to the user who owns the entry (resolved at dispatch time):
-d "eventNotificationTemplate[to][objectType]=KalturaEmailNotificationUserRecipientProvider" \
-d "eventNotificationTemplate[to][userId][objectType]=KalturaEvalStringField" \
-d "eventNotificationTemplate[to][userId][code]={event.object.userId}"
Category Subscribers¶
Send to all users subscribed to a category:
-d "eventNotificationTemplate[to][objectType]=KalturaEmailNotificationCategoryRecipientProvider" \
-d "eventNotificationTemplate[to][categoryId][objectType]=KalturaStringValue" \
-d "eventNotificationTemplate[to][categoryId][value]=$CATEGORY_ID"
Group Members¶
Send to all members of a user group:
-d "eventNotificationTemplate[to][objectType]=KalturaEmailNotificationGroupRecipientProvider" \
-d "eventNotificationTemplate[to][groupId][objectType]=KalturaStringValue" \
-d "eventNotificationTemplate[to][groupId][value]=content-team"
10.5 Content Parameters¶
Email subject and body support dynamic parameters that are resolved at dispatch time:
| Parameter | Description |
|---|---|
{entry_id} |
Entry ID |
{entry_name} |
Entry name |
{entry_description} |
Entry description |
{entry_url} |
Entry URL |
{category_name} |
Category name |
{owner_name} |
Entry owner's name |
{owner_email} |
Entry owner's email |
{partner_name} |
Partner account name |
Available parameters depend on the event object type and the content parameters defined in the template.
10.6 Delivery via the Messaging Service¶
Email notifications are delivered through the Kaltura Messaging microservice, which provides modern email infrastructure:
| Property | Value |
|---|---|
| Delivery infrastructure | Kaltura Messaging Service → SendGrid |
| Default sender | customer_service@kaltura.com (configurable per partner) |
| Delivery latency | ~10-45 seconds after triggering event |
| Format | HTML by default (configurable via format field) |
| Content parameters | Resolved at dispatch time (e.g., {entry_id}, {category_name}) |
Delivery Tracking¶
The Messaging service tracks each email through its delivery lifecycle:
| Status | Description |
|---|---|
sending |
Email queued for delivery |
processed |
Email accepted by SendGrid |
delivered |
Email delivered to recipient's mailbox |
deferred |
Delivery delayed, will retry |
dropped |
Email dropped (invalid address, policy) |
bounce |
Email bounced (mailbox full, domain not found) |
Engagement Tracking¶
After delivery, the Messaging service records engagement events:
| Event | Description |
|---|---|
open |
Recipient opened the email |
click |
Recipient clicked a link in the email |
spamreport |
Recipient reported the email as spam |
unsubscribed |
Recipient unsubscribed via the email link |
Query delivery status and engagement data through the Messaging API's message/stats and message/listDiscreteAggregateMessages endpoints. See the Messaging API guide for full tracking and reporting documentation.
Custom Sender Domains¶
For branded sending domains and dedicated deliverability, configure a custom SendGrid provider through the Messaging API:
curl -X POST "$KALTURA_MESSAGING_URL/email-provider/add" \
-H "Authorization: Bearer $KALTURA_KS" \
-H "Content-Type: application/json" \
-d '{
"type": "sendGrid",
"apiKey": "SG.your-sendgrid-api-key",
"domains": ["notifications.example.com"],
"defaultSender": "alerts@notifications.example.com"
}'
See the Messaging API guide sections 10-11 for full provider and domain configuration.
Unsubscribe Management¶
The Messaging service provides CAN-SPAM compliant unsubscribe management. Users who unsubscribe from specific groups are automatically excluded from future emails to those groups. Manage unsubscribe preferences through the Messaging API's unsubscribe-groups and unsubscribe-users endpoints. See the Messaging API guide section 9 for details.
10.7 Event-Triggered vs Application-Triggered Email¶
The Kaltura platform offers two complementary email approaches that share the same Messaging delivery infrastructure:
| Event Notification Emails (this guide) | Messaging API Direct (Messaging API guide) | |
|---|---|---|
| Trigger | Automatic — fires when a Kaltura event matches template conditions | On-demand — your application calls message/send explicitly |
| Recipients | Defined in template (static, entry owner, category subscribers, group) | Specified at send time (userIds, groupIds) |
| Template tokens | Kaltura content parameters ({entry_id}, {owner_email}) |
Arbitrary tokens (String, User, MagicLink, JwtQrCode, UnsubscribeUri) |
| Use case | Reactive system alerts: "entry ready", "upload complete", "REACH task done" | Proactive communications: invitations, reminders, campaigns |
| Delivery & tracking | Messaging Service → SendGrid (tracking via Messaging API) | Messaging Service → SendGrid (tracking via Messaging API) |
Choose event-triggered emails when you want Kaltura to automatically react to platform events with no application code needed. Choose the Messaging API directly when your application controls the timing, recipients, and personalization. Both can be used together — for example, HTTP webhooks for processing alerts plus Messaging API for user-facing campaigns.
11. Template CRUD Operations¶
11.1 Get a Template¶
curl -X POST "$KALTURA_SERVICE_URL/service/eventnotification_eventnotificationtemplate/action/get" \
-d "ks=$KALTURA_KS" \
-d "format=1" \
-d "id=$TEMPLATE_ID"
11.2 Update a Template¶
curl -X POST "$KALTURA_SERVICE_URL/service/eventnotification_eventnotificationtemplate/action/update" \
-d "ks=$KALTURA_KS" \
-d "format=1" \
-d "id=$TEMPLATE_ID" \
-d "eventNotificationTemplate[objectType]=KalturaHttpNotificationTemplate" \
-d "eventNotificationTemplate[name]=Updated Webhook Name" \
-d "eventNotificationTemplate[url]=https://example.com/webhooks/v2"
| Parameter | Type | Required | Description |
|---|---|---|---|
id |
integer | Yes | Template ID to update |
eventNotificationTemplate[objectType] |
string | Yes | KalturaHttpNotificationTemplate or KalturaEmailNotificationTemplate |
eventNotificationTemplate[name] |
string | No | Updated template name |
eventNotificationTemplate[description] |
string | No | Updated description |
eventNotificationTemplate[url] |
string | No | Updated webhook URL (HTTP templates only) |
eventNotificationTemplate[method] |
integer | No | Updated HTTP method: 1=GET, 2=POST (HTTP templates only) |
eventNotificationTemplate[contentType] |
integer | No | Updated content type (HTTP templates only) |
eventNotificationTemplate[subject] |
string | No | Updated email subject (email templates only) |
eventNotificationTemplate[body] |
string | No | Updated email body (email templates only) |
eventNotificationTemplate[signSecret] |
string | No | Updated HMAC signing secret (HTTP templates only) |
eventNotificationTemplate[eventConditions] |
array | No | Updated event conditions |
Fields not included remain unchanged. The status field cannot be changed via update — use the updateStatus action instead (section 11.4).
11.3 List Your Templates¶
curl -X POST "$KALTURA_SERVICE_URL/service/eventnotification_eventnotificationtemplate/action/list" \
-d "ks=$KALTURA_KS" \
-d "format=1" \
-d "filter[objectType]=KalturaEventNotificationTemplateFilter" \
-d "filter[orderBy]=-createdAt" \
-d "pager[objectType]=KalturaFilterPager" \
-d "pager[pageSize]=25" \
-d "pager[pageIndex]=1"
Returns templates owned by your partner. Use filter fields to narrow results:
| Filter Field | Description |
|---|---|
typeEqual |
Template type string (e.g., httpNotification.Http, emailNotification.Email) |
statusEqual |
Template status (1=DISABLED, 2=ACTIVE, 3=DELETED) |
eventTypeEqual |
Event type ID |
idEqual |
Exact template ID |
partnerIdEqual |
Partner ID |
systemNameEqual |
System name match |
orderBy |
Sort: +createdAt, -createdAt, +updatedAt, -updatedAt, +id, -id |
11.4 Update Template Status¶
Template status is read-only on the template object. Use the updateStatus action to activate or disable a template:
# Activate a template (status=2)
curl -X POST "$KALTURA_SERVICE_URL/service/eventnotification_eventnotificationtemplate/action/updateStatus" \
-d "ks=$KALTURA_KS" \
-d "format=1" \
-d "id=$TEMPLATE_ID" \
-d "status=2"
# Disable a template (status=1)
curl -X POST "$KALTURA_SERVICE_URL/service/eventnotification_eventnotificationtemplate/action/updateStatus" \
-d "ks=$KALTURA_KS" \
-d "format=1" \
-d "id=$TEMPLATE_ID" \
-d "status=1"
| Parameter | Type | Required | Description |
|---|---|---|---|
id |
integer | Yes | Template ID to update |
status |
integer | Yes | New status: 1=DISABLED, 2=ACTIVE |
Returns the updated template object. This is the only way to change a template's status — the update action rejects changes to the status field.
11.5 Delete a Template¶
Delete permanently removes a template. After deletion, get returns NOT_FOUND.
curl -X POST "$KALTURA_SERVICE_URL/service/eventnotification_eventnotificationtemplate/action/delete" \
-d "ks=$KALTURA_KS" \
-d "format=1" \
-d "id=$TEMPLATE_ID"
12. Manual Dispatch¶
Fire a notification template on demand for a specific object, bypassing the automatic event trigger:
curl -X POST "$KALTURA_SERVICE_URL/service/eventnotification_eventnotificationtemplate/action/dispatch" \
-d "ks=$KALTURA_KS" \
-d "format=1" \
-d "id=$TEMPLATE_ID" \
-d "scope[objectType]=KalturaEventNotificationScope" \
-d "scope[objectId]=$KALTURA_ENTRY_ID" \
-d "scope[scopeObjectType]=1"
| Parameter | Type | Description |
|---|---|---|
id |
integer | Template ID to dispatch |
scope[objectType] |
string | Always KalturaEventNotificationScope |
scope[objectId] |
string | The object ID to include in the notification |
scope[scopeObjectType] |
integer/string | Object type matching the template's eventObjectType |
The dispatch action creates a batch job. The response includes a job ID for tracking.
Manual dispatch is useful for: - Testing webhook endpoints during development - Re-sending a failed notification - Triggering notifications for objects that were created before the template existed
13. Common Integration Patterns¶
All patterns below create templates in DISABLED status. After creating, activate with:
curl -X POST "$KALTURA_SERVICE_URL/service/eventnotification_eventnotificationtemplate/action/updateStatus" \
-d "ks=$KALTURA_KS" -d "format=1" -d "id=$TEMPLATE_ID" -d "status=2"
13.1 Entry Processing Complete Webhook¶
Notify your backend when any entry finishes transcoding:
# Step 1: Find the system template for "entry changed"
SYSTEM_TEMPLATES=$(curl -s -X POST "$KALTURA_SERVICE_URL/service/eventnotification_eventnotificationtemplate/action/listTemplates" \
-d "ks=$KALTURA_KS" \
-d "format=1" \
-d "filter[objectType]=KalturaEventNotificationTemplateFilter" \
-d "filter[typeEqual]=httpNotification.Http")
# Step 2: Clone and customize
curl -X POST "$KALTURA_SERVICE_URL/service/eventnotification_eventnotificationtemplate/action/clone" \
-d "ks=$KALTURA_KS" \
-d "format=1" \
-d "id=$SYSTEM_TEMPLATE_ID" \
-d "eventNotificationTemplate[objectType]=KalturaHttpNotificationTemplate" \
-d "eventNotificationTemplate[name]=Entry Ready Notification" \
-d "eventNotificationTemplate[url]=https://myapp.example.com/api/webhooks/entry-ready" \
-d "eventNotificationTemplate[method]=2" \
-d "eventNotificationTemplate[contentType]=2" \
-d "eventNotificationTemplate[signSecret]=my-secret-key" \
-d "eventNotificationTemplate[secureHashingAlgo]=2" \
-d "eventNotificationTemplate[eventDelayedCondition]=1" \
-d "eventNotificationTemplate[status]=1"
Setting eventDelayedCondition=1 ensures the webhook fires only after the entry reaches READY status, so your receiver always gets fully-processed content.
13.2 REACH Task Completion Webhook¶
Get notified when a caption, translation, or other REACH enrichment task completes:
curl -X POST "$KALTURA_SERVICE_URL/service/eventnotification_eventnotificationtemplate/action/add" \
-d "ks=$KALTURA_KS" \
-d "format=1" \
-d "eventNotificationTemplate[objectType]=KalturaHttpNotificationTemplate" \
-d "eventNotificationTemplate[name]=REACH Task Complete" \
-d "eventNotificationTemplate[eventType]=2" \
-d "eventNotificationTemplate[eventObjectType]=42" \
-d "eventNotificationTemplate[url]=https://myapp.example.com/api/webhooks/reach-done" \
-d "eventNotificationTemplate[method]=2" \
-d "eventNotificationTemplate[contentType]=2" \
-d "eventNotificationTemplate[data][objectType]=KalturaHttpNotificationObjectData" \
-d "eventNotificationTemplate[data][format]=1" \
-d "eventNotificationTemplate[data][apiObjectType]=KalturaEntryVendorTask" \
-d "eventNotificationTemplate[status]=1"
Object type 42 is ENTRY_VENDOR_TASK — fires for caption orders, translations, moderation, and all other REACH enrichment service tasks. The payload includes the vendor task object with status, serviceType, serviceFeature, and entryId.
13.3 Metadata Field Change Webhook (Approval Workflow)¶
Trigger a webhook when a custom metadata field changes — for example, when an approval status is updated in a content workflow:
curl -X POST "$KALTURA_SERVICE_URL/service/eventnotification_eventnotificationtemplate/action/add" \
-d "ks=$KALTURA_KS" \
-d "format=1" \
-d "eventNotificationTemplate[objectType]=KalturaHttpNotificationTemplate" \
-d "eventNotificationTemplate[name]=Approval Status Changed" \
-d "eventNotificationTemplate[systemName]=APPROVAL_STATUS_CHANGED" \
-d "eventNotificationTemplate[eventType]=6" \
-d "eventNotificationTemplate[eventObjectType]=metadataEventNotifications.Metadata" \
-d "eventNotificationTemplate[url]=https://myapp.example.com/api/webhooks/approval-changed" \
-d "eventNotificationTemplate[method]=2" \
-d "eventNotificationTemplate[contentType]=2" \
-d "eventNotificationTemplate[eventConditions][0][objectType]=KalturaMetadataFieldChangedCondition" \
-d "eventNotificationTemplate[eventConditions][0][xPath]=/metadata/ApprovalStatus" \
-d "eventNotificationTemplate[eventConditions][0][profileSystemName]=Content_Workflow" \
-d "eventNotificationTemplate[eventConditions][0][versionA]=-1" \
-d "eventNotificationTemplate[eventConditions][0][versionB]=0" \
-d "eventNotificationTemplate[userParameters][0][objectType]=KalturaEventNotificationParameter" \
-d "eventNotificationTemplate[userParameters][0][key]=metadata_field" \
-d "eventNotificationTemplate[userParameters][0][value][objectType]=KalturaStringValue" \
-d "eventNotificationTemplate[userParameters][0][value][value]=ApprovalStatus" \
-d "eventNotificationTemplate[status]=1"
This fires only when the ApprovalStatus field in the Content_Workflow metadata profile changes between versions. The versionA=-1 / versionB=0 comparison means "previous version vs. current version."
13.4 Content Moderation Workflow (Entry Status Change)¶
Webhook for moderation review — fires when an entry moves to MODERATE (status=5) or BLOCKED (status=6):
curl -X POST "$KALTURA_SERVICE_URL/service/eventnotification_eventnotificationtemplate/action/add" \
-d "ks=$KALTURA_KS" \
-d "format=1" \
-d "eventNotificationTemplate[objectType]=KalturaHttpNotificationTemplate" \
-d "eventNotificationTemplate[name]=Moderation Required" \
-d "eventNotificationTemplate[eventType]=2" \
-d "eventNotificationTemplate[eventObjectType]=1" \
-d "eventNotificationTemplate[url]=https://myapp.example.com/api/webhooks/moderation" \
-d "eventNotificationTemplate[method]=2" \
-d "eventNotificationTemplate[contentType]=2" \
-d "eventNotificationTemplate[eventConditions][0][objectType]=KalturaEventFieldCondition" \
-d "eventNotificationTemplate[eventConditions][0][description]=Entry moved to moderation" \
-d "eventNotificationTemplate[eventConditions][0][field][objectType]=KalturaEvalBooleanField" \
-d "eventNotificationTemplate[eventConditions][0][field][code]=in_array({event.object.status},array(5,6))" \
-d "eventNotificationTemplate[data][objectType]=KalturaHttpNotificationObjectData" \
-d "eventNotificationTemplate[data][format]=1" \
-d "eventNotificationTemplate[data][apiObjectType]=KalturaBaseEntry" \
-d "eventNotificationTemplate[status]=1"
13.5 Category Membership Change Email¶
Email category managers when new users join their channel/category:
curl -X POST "$KALTURA_SERVICE_URL/service/eventnotification_eventnotificationtemplate/action/add" \
-d "ks=$KALTURA_KS" \
-d "format=1" \
-d "eventNotificationTemplate[objectType]=KalturaEmailNotificationTemplate" \
-d "eventNotificationTemplate[name]=New Category Member" \
-d "eventNotificationTemplate[eventType]=1" \
-d "eventNotificationTemplate[eventObjectType]=12" \
-d "eventNotificationTemplate[format]=1" \
-d "eventNotificationTemplate[subject]=New member joined category" \
-d "eventNotificationTemplate[body]=A new user has joined a category you manage.<br>Category: {category_name}<br>User: {owner_name}" \
-d "eventNotificationTemplate[fromEmail]=notifications@example.com" \
-d "eventNotificationTemplate[fromName]=Content Platform" \
-d "eventNotificationTemplate[to][objectType]=KalturaEmailNotificationStaticRecipientProvider" \
-d "eventNotificationTemplate[to][emailRecipients][0][objectType]=KalturaEmailNotificationRecipient" \
-d "eventNotificationTemplate[to][emailRecipients][0][email][objectType]=KalturaStringValue" \
-d "eventNotificationTemplate[to][emailRecipients][0][email][value]=manager@example.com" \
-d "eventNotificationTemplate[to][emailRecipients][0][name][objectType]=KalturaStringValue" \
-d "eventNotificationTemplate[to][emailRecipients][0][name][value]=Category Manager" \
-d "eventNotificationTemplate[status]=1"
Object type 12 is CATEGORYKUSER — fires when users are added to or removed from categories.
13.6 New Upload Email Alert¶
Email an admin when new content is uploaded:
curl -X POST "$KALTURA_SERVICE_URL/service/eventnotification_eventnotificationtemplate/action/add" \
-d "ks=$KALTURA_KS" \
-d "format=1" \
-d "eventNotificationTemplate[objectType]=KalturaEmailNotificationTemplate" \
-d "eventNotificationTemplate[name]=New Upload Alert" \
-d "eventNotificationTemplate[eventType]=1" \
-d "eventNotificationTemplate[eventObjectType]=1" \
-d "eventNotificationTemplate[format]=1" \
-d "eventNotificationTemplate[subject]=New entry uploaded: {entry_name}" \
-d "eventNotificationTemplate[body]=A new entry has been uploaded.<br>Name: {entry_name}<br>ID: {entry_id}<br>Owner: {owner_name}" \
-d "eventNotificationTemplate[fromEmail]=kaltura@example.com" \
-d "eventNotificationTemplate[fromName]=Kaltura System" \
-d "eventNotificationTemplate[to][objectType]=KalturaEmailNotificationStaticRecipientProvider" \
-d "eventNotificationTemplate[to][emailRecipients][0][objectType]=KalturaEmailNotificationRecipient" \
-d "eventNotificationTemplate[to][emailRecipients][0][email][objectType]=KalturaStringValue" \
-d "eventNotificationTemplate[to][emailRecipients][0][email][value]=admin@example.com" \
-d "eventNotificationTemplate[to][emailRecipients][0][name][objectType]=KalturaStringValue" \
-d "eventNotificationTemplate[to][emailRecipients][0][name][value]=Admin" \
-d "eventNotificationTemplate[status]=1"
13.7 Entry Deleted Webhook (Audit / Compliance)¶
Track all content deletions for compliance and audit logging:
curl -X POST "$KALTURA_SERVICE_URL/service/eventnotification_eventnotificationtemplate/action/add" \
-d "ks=$KALTURA_KS" \
-d "format=1" \
-d "eventNotificationTemplate[objectType]=KalturaHttpNotificationTemplate" \
-d "eventNotificationTemplate[name]=Entry Deleted Audit" \
-d "eventNotificationTemplate[eventType]=7" \
-d "eventNotificationTemplate[eventObjectType]=1" \
-d "eventNotificationTemplate[url]=https://myapp.example.com/api/audit/entry-deleted" \
-d "eventNotificationTemplate[method]=2" \
-d "eventNotificationTemplate[contentType]=2" \
-d "eventNotificationTemplate[data][objectType]=KalturaHttpNotificationObjectData" \
-d "eventNotificationTemplate[data][format]=1" \
-d "eventNotificationTemplate[data][apiObjectType]=KalturaBaseEntry" \
-d "eventNotificationTemplate[signSecret]=audit-secret-key" \
-d "eventNotificationTemplate[secureHashingAlgo]=2" \
-d "eventNotificationTemplate[status]=1"
Event type 7 (OBJECT_DELETED) fires when an entry is deleted. Use this for audit trails and compliance records.
13.8 Clone-and-Customize Pattern (Recommended Workflow)¶
The recommended production pattern: list system templates by systemName, clone, and customize with userParameters. This approach inherits tested event/condition configurations and adds your customizations on top:
# Step 1: Find the system template by systemName
curl -s -X POST "$KALTURA_SERVICE_URL/service/eventnotification_eventnotificationtemplate/action/listTemplates" \
-d "ks=$KALTURA_KS" \
-d "format=1" \
-d "filter[objectType]=KalturaEventNotificationTemplateFilter" \
-d "filter[systemNameEqual]=ENTRY_CHANGED"
# Step 2: Clone with your URL and authentication
curl -X POST "$KALTURA_SERVICE_URL/service/eventnotification_eventnotificationtemplate/action/clone" \
-d "ks=$KALTURA_KS" \
-d "format=1" \
-d "id=$SYSTEM_TEMPLATE_ID" \
-d "eventNotificationTemplate[objectType]=KalturaHttpNotificationTemplate" \
-d "eventNotificationTemplate[name]=CRM Entry Sync" \
-d "eventNotificationTemplate[url]=https://crm.example.com/api/kaltura/entry-changed" \
-d "eventNotificationTemplate[method]=2" \
-d "eventNotificationTemplate[authUsername]=kaltura-integration" \
-d "eventNotificationTemplate[authPassword]=integration-secret" \
-d "eventNotificationTemplate[authenticationMethod]=1" \
-d "eventNotificationTemplate[signSecret]=crm-webhook-secret" \
-d "eventNotificationTemplate[secureHashingAlgo]=2" \
-d "eventNotificationTemplate[data][objectType]=KalturaHttpNotificationObjectData" \
-d "eventNotificationTemplate[data][format]=1" \
-d "eventNotificationTemplate[data][apiObjectType]=KalturaBaseEntry" \
-d "eventNotificationTemplate[status]=1"
14. API Actions Reference¶
| Action | Description |
|---|---|
listTemplates |
List system templates available for cloning (partner 0) |
clone |
Clone a system template into your partner account |
add |
Create a new template from scratch |
get |
Retrieve a template by ID |
update |
Update template fields |
list |
List your partner's templates (with filters) |
updateStatus |
Change template status (activate/disable) |
delete |
Permanently delete a template |
dispatch |
Manually fire a template for a specific object |
listByPartner |
List templates across partners (admin) |
15. Error Handling¶
| Error Code | Meaning | Resolution |
|---|---|---|
EVENT_NOTIFICATION_TEMPLATE_NOT_FOUND |
Template ID does not exist | Verify the ID; template may have been deleted (hard delete) |
SERVICE_FORBIDDEN |
Event Notification plugin not enabled | Contact your Kaltura account manager to enable the plugin |
PROPERTY_VALIDATION_NOT_UPDATABLE |
Attempted to update an immutable field (e.g., status via update) |
Use updateStatus action to change template status |
DISPATCH_DISABLED |
Manual dispatch not enabled for this template | Enable manual dispatch in template configuration, or trigger via actual events |
INVALID_KS |
KS is invalid, expired, or lacks required privileges | Generate a fresh admin KS with disableentitlement privilege |
HTTP 500 on list action |
Transient backend issue (known intermittent) | Retry the request; use get by ID as a fallback for verification |
Retry strategy: For transient errors (HTTP 5xx, timeouts), retry with exponential backoff: 1s, 2s, 4s, with jitter, up to 3 retries. For client errors (INVALID_KS, SERVICE_FORBIDDEN, EVENT_NOTIFICATION_TEMPLATE_NOT_FOUND), fix the request before retrying — these will not resolve on their own. For async operations (webhook dispatch jobs), poll with increasing intervals (5s, 10s, 30s) rather than tight loops.
16. Best Practices¶
- Clone system templates instead of creating from scratch. System templates provide tested defaults for common event types; customize after cloning.
- Verify webhook signatures with HMAC. Compute the expected signature and compare with the header value to authenticate incoming webhooks.
- Use Boolean templates as conditions for REACH automation rules. Boolean templates evaluate without dispatching; pair them with
KalturaReachProfile.rulesfor conditional auto-processing. - Use the Messaging Service for user-facing emails. Email dispatch templates use the Messaging Service (SendGrid) infrastructure — configure domain authentication for deliverability.
- Test with manual dispatch before enabling auto-fire. Use
dispatchto verify your endpoint handles the payload correctly before relying on live events. - Design for Kaltura's retry policy. Kaltura retries failed webhook deliveries (HTTP 5xx or timeout) up to 10 times with exponential backoff over approximately 24 hours. Your endpoint should return HTTP 200 promptly to acknowledge receipt, then process the payload asynchronously. If your endpoint is down for an extended period, notifications will be lost after the retry window expires. Implement idempotency on your receiver — the same notification may be delivered more than once if your endpoint returns a non-200 status before Kaltura registers the acknowledgment.
- Use AppTokens for production webhook receivers. Webhook receivers that call back into the Kaltura API should use AppTokens, not hardcoded admin secrets.
- Use
eventDelayedConditionfor content-dependent workflows. SeteventDelayedCondition=1on templates that need fully-processed entries (e.g., ready for playback). This avoids webhook receivers dealing with entries still in transcoding. - Use the
eventnotification_eventnotificationtemplateservice for all event notification needs. It provides HTTP webhooks, email dispatch, and condition-based filtering. (The legacynotification.getClientNotificationAPI is deprecated.)
17. Related Guides¶
- Session Guide — KS generation and management
- AppTokens API — Secure server-to-server auth
- Upload & Ingestion — Content upload and ingestion (entries that trigger webhooks)
- REACH API — Enrichment services marketplace: captions, translation, moderation, and more (ENTRY_VENDOR_TASK events)
- Agents Manager API — Automated content processing (alternative to webhooks for content workflows)
- Messaging API — Template-based email messaging with delivery tracking, engagement analytics, and unsubscribe management (shared delivery infrastructure for email notifications; use directly for application-triggered emails)
- User Management API — User event notifications (user creation, role changes)
- Categories & Entitlements API — Category event notifications (category membership changes, entitlement updates)
- Custom Metadata API — Metadata change events (OBJECT_ADDED, OBJECT_DATA_CHANGED, OBJECT_DELETED) that trigger webhook notifications
- Captions & Transcripts API — Caption asset events that trigger webhook notifications
- Distribution — Trigger notifications on distribution status changes
- Events Platform — Event lifecycle callbacks for virtual events
- Syndication — Trigger feed updates on content changes
- Analytics Reports — Trigger automated reporting on content events
- Gamification — Event notifications feed gamification rules engine