ServiceNow connector
The ServiceNow connector connects Kibana to your ServiceNow instance through the ServiceNow Table API. Agents and workflows can use it to search and read records such as incidents, knowledge articles, comments, and attachments.
You can use this connector in Agent Builder and Workflows.
Some capabilities of this connector are only available from a certain version:
-
Write actions to create, update, close, and delete records, add comments and work notes, and upload attachments. -
Lookup actions to find choice values, user IDs, and the identity of the connector account before you write.
For the ServiceNow ITSM, SecOps, and ITOM connectors used with alerting and cases, refer to ServiceNow ITSM, ServiceNow SecOps, and ServiceNow ITOM.
In ServiceNow, you need:
- The
adminrole, to register an OAuth application in the Application Registry. - A ServiceNow user with the roles for the actions you plan to use. With OAuth 2.0 Client Credentials, this is the user associated with the OAuth client. With OAuth 2.0 Authorization Code, this is the account that signs in to authorize the connector.
- Read operations (Search, Get record, List records):
itilfor incidents,knowledgefor knowledge articles. -
Write operations (Create/Update/Close incident, Add comment, Add work note): itilwith write permissions. -
Security incidents (Create security incident): sn_si_incident_write. -
Delete record: admin or equivalent role on the target table. -
ITOM events (Create event): evt_mgmt_integration, orevt_mgmt_operatororevt_mgmt_admin.
- Read operations (Search, Get record, List records):
In Kibana, you need:
- The Actions and Connectors : All privilege, to create and edit connectors.
To use the connector, set up OAuth in ServiceNow, create the connector in Kibana, and test it.
ServiceNow connectors authenticate with OAuth 2.0. Register an OAuth application in ServiceNow for the method you plan to use, then copy its client ID and client secret.
- Select System OAuth → Application Registry.
- Select New, then select Create an OAuth API endpoint for external clients.
- Enter a name for your application.
- Enter a Client Secret value, or let ServiceNow generate one.
- Select Submit.
- Copy the following values from the OAuth application:
- Client ID: The auto-generated client ID.
- Client Secret: The secret you configured.
- Verify that the OAuth client is associated with a user account that has the roles listed in Prerequisites.
Use this method to let individual users sign in to ServiceNow through Kibana. Kibana stores refreshable tokens on the user's behalf.
- Select System OAuth → Application Registry.
- Select New, then select Create an OAuth API endpoint for external clients.
- Configure the application as follows:
Name: Enter a name for the application (for example, "Elastic Kibana").
Redirect URL: Enter Kibana's connector OAuth callback URL. Copy the following pattern and replace your public Kibana hostname:
https://<your-kibana-host>/api/actions/connector/_oauth_callbackClient Secret: Enter a value, or let ServiceNow generate one.
- Select Submit.
- Copy the Client ID and Client Secret from the application.
The connector automatically configures the correct ServiceNow OAuth endpoints for your instance. You do not need to enter the authorization or token URLs manually.
You can create connectors in Stack Management → Connectors.
ServiceNow connectors support OAuth 2.0 Client Credentials and OAuth 2.0 Authorization Code authentication. Select the authentication type when you create or edit the connector.
- Instance URL
- The URL of your ServiceNow instance (for example,
https://your-instance.service-now.com).
- Token URL
- The OAuth 2.0 token endpoint URL for your ServiceNow instance (for example,
https://your-instance.service-now.com/oauth_token.do). - Client ID
- The OAuth client ID from your ServiceNow application registry.
- Client Secret
- The OAuth client secret for your ServiceNow application.
- Client ID
- The OAuth client ID from your ServiceNow application registry. Refer to OAuth Authorization Code setup.
- Client Secret
- The OAuth client secret for your ServiceNow application.
After you enter these values, authorize with your ServiceNow account.
The connector automatically uses the correct ServiceNow OAuth endpoints for your instance (https://<your-instance>.service-now.com/oauth_auth.do for authorization and https://<your-instance>.service-now.com/oauth_token.do for token exchange). The connector handles scopes automatically.
Use the Action configuration settings to customize connector networking, such as proxies, certificates, or TLS settings. You can set configurations that apply to all your connectors or use xpack.actions.customHostSettings to set per-host configurations.
You can test connectors when you create or edit the connector in Kibana.
The test verifies connectivity by querying the sys_user table, which any authenticated user can access.
The ServiceNow connector has the following actions.
Use these actions to find and read ServiceNow records, tables, comments, and attachments.
- Search
-
Search for records in a ServiceNow table using full-text search.
table(required): The table to search. Common values:incident,kb_knowledge,sc_req_item,change_request,problem,sc_task,cmdb_ci. Custom tables are also supported.query(required): The full-text search query string.encodedQuery(optional): ServiceNow encoded query to combine with the full-text search for additional filtering (for example,active=true^priority=1). Uses^to AND conditions and^ORfor OR.fields(optional): Comma-separated list of fields to return.limit(optional): Maximum number of results (default: 20).offset(optional): Offset for pagination.
- Get record
-
Retrieve a specific record by its
sys_id. To retrieve a knowledge article with full content, usetable=kb_knowledgeand request fields:sys_id,number,short_description,text,topic,category,author,sys_created_on,sys_updated_on,workflow_state,kb_knowledge_base,kb_category.table(required): The table containing the record.sysId(required): Thesys_idof the record.fields(optional): Comma-separated list of fields to return.
- List records
-
List records from a table with optional filtering.
table(required): The table to query. Common values:incident,kb_knowledge,sc_req_item,change_request,problem,sc_task,cmdb_ci. Custom tables are also supported.encodedQuery(optional): ServiceNow encoded query for filtering (for example,active=true^priority=1).fields(optional): Comma-separated list of fields to return.limit(optional): Maximum number of results (default: 20).offset(optional): Offset for pagination.orderBy(optional): Field to order by (prefix with-for descending).
- List knowledge bases
-
List available knowledge bases with their titles and descriptions. Use this to discover what knowledge bases exist before searching for articles.
limit(optional): Maximum number of results (default: 20).offset(optional): Offset for pagination.
- Get comments
-
Retrieve comments and work notes for a specific record. Use this action to understand the history and context of an incident, change request, or other record.
tableName(required): The table the record belongs to (for example,incident,change_request).recordSysId(required): Thesys_idof the record.limit(optional): Maximum number of journal entries to return (default: 20).offset(optional): Offset for pagination.
- List tables
-
List available ServiceNow tables with their names and labels. Use this to discover what tables exist in the instance, especially for custom or unfamiliar ServiceNow configurations.
query(optional): Filter to search table names or labels (for example,incident,CMDB).limit(optional): Maximum number of results (default: 50).offset(optional): Offset for pagination.
- Describe table
-
Describe the structure of a ServiceNow table by listing its fields, including inherited fields, with their types, labels, and constraints. Use this to find out which fields to request or filter on before you query the table.
table(required): The name of the table to describe (for example,incident,kb_knowledge,change_request).
- Get attachment
-
Download a ServiceNow attachment as base64-encoded binary content by its attachment
sys_id. ReturnsfileName,contentType, andbase64fields. To process document content (PDFs, Word files, and so on), pass the base64 value through the Elasticsearch attachment processor. To find attachmentsys_idvalues, query thesys_attachmenttable using List records withencodedQuery=table_name=<table>^table_sys_id=<record_sys_id>.sysId(required): Thesys_idof the attachment (from thesys_attachmenttable).
Use these actions to find the choice values, user IDs, and account identity you need before you write to ServiceNow.
- Get choices
-
Look up valid choice values for a ServiceNow field. Call this before writing to discover valid values for
state,close_code,category,impact,urgency, and other choice-list fields. Returns values with their display labels.tableName(required): The ServiceNow table to get choices for (for example,incident,change_request,sn_si_incident).fieldName(required): The field name to get choices for (for example,state,close_code,category,impact,urgency,priority).language(optional): Language code for choice labels (default:en).
- Query users
-
Search ServiceNow users by name, email, or username. Use this to look up the
sys_idforcaller_idorassigned_tofields before creating or updating an incident.query(optional): Search text to filter users by name, email, or username. Omit to list recent users.limit(optional): Maximum number of users to return (default: 20).offset(optional): Offset for pagination.
- Who am I
- Return the identity of the currently authenticated ServiceNow user. Returns
sys_id,user_name,name,email,title,department, andactivestatus. Use this to verify connector credentials, find thesys_idof the connector account for use ascaller_id, or confirm which account is performing write operations. Takes no parameters.
These actions change data in ServiceNow. The connector user needs the write roles listed in Prerequisites.
- Create record
-
Insert a new record into any ServiceNow table. Returns the created record including its
sys_idand record number. For ITSM incidents, use Create incident; for security incidents, use Create security incident; for ITOM events, use Create event. Use this action for all other tables.table(required): The table to insert the record into.fields(required): Key-value map of ServiceNow field names to values for the new record (for example,{"short_description": "VPN issue", "impact": "2"}). At least one field required; maximum 100 fields.
- Update record
-
Update an existing record in any ServiceNow table by its
sys_id. Provide only the fields that need to change — the connector leaves all other fields untouched. Returns the full updated record. For ITSM incidents, use Update incident.table(required): The table containing the record.sysId(required): Thesys_idof the record to update.fields(required): Key-value map of field names to their new values. At least one field required; maximum 100 fields.
- Create incident
-
Create a new ITSM incident in ServiceNow. Returns the created incident including its
sys_idand incident number (for example,INC0012345). Use Query users to resolve names tosys_idvalues forcaller_idandassigned_to. Use Get choices to discover valid values forcategory,impact, andurgency.short_description(required): Brief one-line summary of the incident.description(optional): Detailed description.caller_id(optional):sys_idor username of the reporting user.impact(optional): Business impact —1=High,2=Medium,3=Low.urgency(optional): Urgency level —1=High,2=Medium,3=Low.category(optional): Incident category.subcategory(optional): Incident subcategory.assignment_group(optional):sys_idor name of the assignment group.assigned_to(optional):sys_idor username of the assigned technician.comments(optional): Initial customer-visible comment.work_notes(optional): Initial internal work note (not visible to the caller).
- Update incident
-
Update an existing ITSM incident by its
sys_id. Provide only the fields to change. Returns the updated incident. To resolve or close an incident, use Close incident instead.sysId(required): Thesys_idof the incident to update.short_description(optional): Updated brief summary.description(optional): Updated detailed description.state(optional): Incident state —1=New,2=In Progress,3=On Hold,6=Resolved,7=Closed.caller_id(optional):sys_idor username of the caller.impact(optional): Business impact —1=High,2=Medium,3=Low.urgency(optional): Urgency level —1=High,2=Medium,3=Low.category(optional): Incident category.subcategory(optional): Incident subcategory.assignment_group(optional):sys_idor name of the assignment group.assigned_to(optional):sys_idor username of the assigned technician.comments(optional): Customer-visible comment to append.work_notes(optional): Internal work note to append (not visible to the caller).close_code(optional): Resolution close code (use Get choices withtableName=incident,fieldName=close_code).close_notes(optional): Detailed resolution notes (required when setting state to6or7).
- Add comment
-
Add a customer-visible comment to a ServiceNow record. The comment appears in the record journal and is visible to the caller. Use Add work note for internal-only notes.
table(required): The table containing the record (for example,incident,change_request).sysId(required): Thesys_idof the record.comment(required): The comment text to add.
- Add work note
-
Add an internal work note to a ServiceNow record. Work notes are only visible to agents and never shown to the caller. Use Add comment for customer-facing journal entries.
table(required): The table containing the record (for example,incident,change_request).sysId(required): Thesys_idof the record.workNote(required): The internal work note text to add.
- Close incident
-
Resolve or close a ServiceNow incident by setting its state to Resolved (
6) or Closed (7). A close code and close notes are required. Use Get choices withtableName=incident,fieldName=close_codeto see valid close codes for the instance.sysId(required): Thesys_idof the incident to close.closeCode(required): Resolution close code.closeNotes(required): Detailed description of how the incident was resolved.state(optional): Final state —6=Resolved,7=Closed (default:6).
- Create security incident
-
Create a new Security Operations (SecOps/SIR) incident in the
sn_si_incidenttable. Use this for cyber security incidents and threat investigations rather than ITSM incidents. Returns the created incident with itssys_id.NoteRequires the ServiceNow Security Incident Response (SIR) plugin to be installed on the ServiceNow instance. The connector user must have the
sn_si_incident_writerole. If the plugin is absent, the connector returns a 400 error stating that the table does not exist.short_description(required): Brief summary of the security incident.description(optional): Detailed description.priority(optional): Priority —1=Critical,2=High,3=Moderate,4=Low,5=Planning.category(optional): Security incident category (use Get choices withtableName=sn_si_incident,fieldName=category).subcategory(optional): Security incident subcategory.assignment_group(optional):sys_idor name of the assignment group.assigned_to(optional):sys_idor username of the assigned analyst.affected_user(optional):sys_idor username of the affected user.comments(optional): Initial customer-visible comment.work_notes(optional): Initial internal work note.business_criticality(optional): Business criticality —1=Critical,2=High,3=Medium,4=Low,5=Negligible.
- Create event
-
Send an ITOM event to ServiceNow Event Management via
/api/global/em/jsonv2. Creates or updates an alert in the Event Management console. Usemessage_keyto deduplicate: events with the samesource,node,type, andmessage_keyupdate the existing alert instead of creating a new one.NoteRequires the ServiceNow Event Management (ITOM) plugin to be installed on the ServiceNow instance. The connector user must have the
evt_mgmt_integrationrole (orevt_mgmt_operator/evt_mgmt_admin). If the plugin is absent or the role is missing, the connector returns a 400 error.source(required): Event source system (for example,"Elastic","monitoring-agent").type(required): Event type or category (for example,"high_cpu","service_down").node(optional): Hostname or IP address of the affected node.resource(optional): Affected resource name (disk partition, service name, and so on).metric_name(optional): Name of the metric that triggered the event.value(optional): Current metric value at the time of the event (for example,"95.2").severity(optional): Severity —0=Clear,1=Critical,2=Major,3=Minor,4=Warning,5=Info.description(optional): Detailed description of the event.message_key(optional): Unique key for deduplication.additional_info(optional): Extra key-value metadata to attach to the event (maximum 50 entries).
- Upload attachment
-
Upload a file attachment to a ServiceNow record. The file must be provided as base64-encoded content. Returns the attachment metadata including the new attachment
sys_id. Avoid files larger than 5 MB. To retrieve existing attachments use Get attachment.tableName(required): The ServiceNow table to attach the file to (for example,incident,change_request).tableSysId(required): Thesys_idof the record to attach the file to.fileName(required): Name of the file including extension (for example,screenshot.png,report.pdf).contentType(required): MIME type of the file (for example,application/pdf,image/png,text/plain).base64Content(required): Base64-encoded file content.
- Delete record
-
Permanently delete a record from a ServiceNow table by its
sys_id. This operation cannot be undone. Use only for automation-created records that need cleanup — prefer updating state to "Cancelled" or "Closed" over deleting business records.table(required): The table containing the record to delete.sysId(required): Thesys_idof the record to permanently delete.
The connector can start a workflow from an incident, a journal entry, or a change-approval update. A saved connector does not receive events until Receive events is turned on for that connector. After you save a new connector, Kibana shows the Webhook URL and the Ingest token once, so copy them then. For an existing connector, save it, then select Rotate ingest token. A new token stops the previous one from working. This toggle appears when xpack.actions.inboundEvents.enabled is true.
In ServiceNow, you need the admin role to create the outbound REST message and the business rules. Incident and journal events need Incident Management, which provides the incident table. Change-approval events need Change Management, which provides change_request. Without Change Management, you can still use incident and journal events. ServiceNow must be able to reach a Kibana URL. A developer instance cannot call localhost.
In Kibana, you need an Enterprise license and server.publicBaseUrl set to the host that ServiceNow uses to reach Kibana. xpack.actions.inboundEvents.enabled defaults to true. Set it to false to turn receive events off.
Kibana starts the workflows that are enabled and subscribed to the matching event. To send events from ServiceNow, refer to Start a workflow from ServiceNow events.
The connector supports six events. A workflow subscribes to an event by using its ID as the trigger type.
| Workflow event | occurrence |
Required fields | Optional fields |
|---|---|---|---|
servicenow_search.incident_created |
incident.created |
table, sys_id, number |
summary, state, priority, assignment_group, assigned_to |
servicenow_search.incident_updated |
incident.updated |
table, sys_id |
number, changed_fields |
servicenow_search.incident_resolved |
incident.resolved |
table, sys_id, state |
number, close_code, close_notes |
servicenow_search.comment_added |
comment.added |
table, sys_id, journal_entry_id, author, text |
number, timestamp |
servicenow_search.work_note_added |
work_note.added |
table, sys_id, journal_entry_id, author, text |
number, timestamp |
servicenow_search.change_approval_state_changed |
change.approval_state_changed |
change_request_id, approval_id, state |
approver, previous_state |
Reference fields are sys_ids (getValue()), not display values. sys_updated_on is used only to correlate retries. It is not a workflow field. A body that omits it still starts the workflow, with a new correlation key. summary is the incident short description. changed_fields is an array of up to 20 objects, { "field", "previous", "current" }. previous and current are included when ServiceNow sent them. Identifiers are limited to 128 characters, field values and summary to 1,024, and text and close_notes to 40,000.
incident.resolved covers both resolved and closed. The resulting state is on the event, so a workflow condition can keep one of the two. A comment, a work note, and an approval are separate occurrences. A workflow subscribed to one of them does not run for the others.
An occurrence that is not in this table, or a body missing a required field, does not start these workflows.
ServiceNow sends each event to the webhook URL of the connector. Copy the Webhook URL from the connector. It has one of these shapes. The default space has no /s/{space-id} prefix.
https://<kibana-host>/api/actions/events/.servicenow_search/<connector-id>
https://<kibana-host>/s/<space-id>/api/actions/events/.servicenow_search/<connector-id>
Send Authorization: Bearer <ingest-token> and Content-Type: application/json. If the REST message cannot set Authorization, add ?token=<ingest-token> to the URL instead.
To run a Kibana workflow when an incident, comment, work note, or change approval changes in ServiceNow, create an outbound REST message and business rules in ServiceNow, then subscribe a workflow to the event. Kibana does not create the ServiceNow rules for you.
Before you start, meet the requirements in Receive ServiceNow events and turn on Receive events on the connector. Create the REST message first, then the rules that use it. ServiceNow does not send a record that was saved before the REST message and the matching rule existed, so create a new record to test.
The rules run after the database write and send the call with executeAsync(), so the user transaction does not wait on Kibana. Flow Designer and IntegrationHub are not required. The user who changes a record must be able to read that record. The journal rule sends a work note only when that user can read work_notes on the incident.
In the ServiceNow banner, select All and enter REST Message. Open System Web Services → Outbound → REST Message. The Admin workspace menu does not list this record.
Create a message whose Name is exactly Elastic Workflows, then save it before adding a method. Under HTTP Methods, select New and set:
- Name:
post. The scripts look up this name. It is case sensitive. POST,Default POST, or any other name throwscom.glide.communications.ProcessingExceptionand writes nothing to the outbound HTTP log. That error is in System Logs → Errors. - HTTP method: POST. This dropdown is the verb. It is separate from Name.
- Endpoint: the Webhook URL from the connector, on a host the ServiceNow instance can reach.
- HTTP header
Content-Type:application/json - HTTP header
Authorization:Bearer <ingest-token>, where the value is the Ingest token from the connector
The three business rules call new sn_ws.RESTMessageV2('Elastic Workflows', 'post'). If you rotate the ingest token in Kibana, update this header, or the token query parameter, with the new token and save the message.
Select All, enter Business Rules, and open System Definition → Business Rules. Create an after business rule on incident with Advanced, Insert, and Update selected. Put the script on the Advanced tab. Set When to after, not async. An async rule has no previous record, so previous.nil() is true for an update and the workflow receives servicenow_search.incident_created.
On insert, current.operation() is insert and the script sends incident.created.
When state changes to the resolved or closed value, it sends incident.resolved and does not also send incident.updated. Out-of-box values are 6 (Resolved) and 7 (Closed). If this instance uses different choices, change those two values in the script. Any other watched-field change sends incident.updated with changed_fields. A journal-only update changes none of those fields, so the script does not call Kibana. Comments and work notes are delivered by the journal rule.
(function executeRule(current, previous) {
var isInsert = current.operation() == 'insert';
var state = current.getValue('state');
var stateChanged = !isInsert && current.state.changes();
var isResolvedOrClosed = stateChanged && (state == '6' || state == '7');
var occurrence;
if (isInsert) {
occurrence = 'incident.created';
} else if (isResolvedOrClosed) {
occurrence = 'incident.resolved';
} else {
occurrence = 'incident.updated';
}
var watched = [
'short_description', 'state', 'priority', 'assignment_group', 'assigned_to',
'urgency', 'impact', 'category', 'caller_id', 'cmdb_ci', 'close_code', 'close_notes'
];
var changedFields = [];
if (occurrence == 'incident.updated') {
for (var i = 0; i < watched.length; i++) {
var fieldName = watched[i];
if (current[fieldName].changes()) {
changedFields.push({
field: fieldName,
previous: previous.getValue(fieldName),
current: current.getValue(fieldName)
});
}
}
if (changedFields.length === 0) {
return;
}
}
var body = {
occurrence: occurrence,
table: current.getTableName(),
sys_id: current.getUniqueValue(),
number: current.getValue('number'),
sys_updated_on: current.getValue('sys_updated_on')
};
if (occurrence == 'incident.created') {
body.summary = current.getValue('short_description');
body.state = state;
body.priority = current.getValue('priority');
body.assignment_group = current.getValue('assignment_group');
body.assigned_to = current.getValue('assigned_to');
} else if (occurrence == 'incident.updated') {
body.changed_fields = changedFields.slice(0, 20);
} else {
body.state = state;
body.close_code = current.getValue('close_code');
body.close_notes = current.getValue('close_notes');
}
var request = new sn_ws.RESTMessageV2('Elastic Workflows', 'post');
request.setRequestBody(JSON.stringify(body));
request.executeAsync();
})(current, previous);
Create an after business rule on sys_journal_field with Insert selected. Set the condition to name=incident and element in comments, work_notes. comments sends comment.added. work_notes sends work_note.added only when the user who saved the record can read work_notes on the parent incident. table and sys_id identify that incident (name and element_id). author is sys_created_by on the journal row.
(function executeRule(current, previous) {
var element = current.getValue('element');
var occurrence;
if (element == 'comments') {
occurrence = 'comment.added';
} else if (element == 'work_notes') {
occurrence = 'work_note.added';
} else {
return;
}
var parent = new GlideRecord(current.getValue('name'));
var parentFound = parent.get(current.getValue('element_id'));
if (element == 'work_notes' && (!parentFound || !parent.work_notes.canRead())) {
return;
}
var text = current.getValue('value');
var author = current.getValue('sys_created_by');
if (!text || !author) {
return;
}
var body = {
occurrence: occurrence,
table: current.getValue('name'),
sys_id: current.getValue('element_id'),
journal_entry_id: current.getUniqueValue(),
author: author,
text: text,
timestamp: current.getValue('sys_created_on')
};
if (parentFound) {
body.number = parent.getValue('number');
}
var request = new sn_ws.RESTMessageV2('Elastic Workflows', 'post');
request.setRequestBody(JSON.stringify(body));
request.executeAsync();
})(current, previous);
Create an after business rule on sysapproval_approver with Update selected and a condition that State changes. after is required so previous contains the approval state before the change. The script sends change.approval_state_changed only when sysapproval is the sys_id of a change_request. Approvals for other tables are ignored. approver is the approver's sys_id. state is the current approval choice, such as approved or rejected.
(function executeRule(current, previous) {
if (!current.state.changes()) {
return;
}
var changeRequestId = current.getValue('sysapproval');
var changeRequest = new GlideRecord('change_request');
if (!changeRequest.get(changeRequestId)) {
return;
}
var body = {
occurrence: 'change.approval_state_changed',
change_request_id: changeRequestId,
approval_id: current.getUniqueValue(),
state: current.getValue('state'),
approver: current.getValue('approver'),
previous_state: previous.getValue('state')
};
var request = new sn_ws.RESTMessageV2('Elastic Workflows', 'post');
request.setRequestBody(JSON.stringify(body));
request.executeAsync();
})(current, previous);
Create a new incident after the REST message and the incident rule are saved. Then select All, enter Outbound HTTP Log, and open the list at sys_outbound_http_log_list.do. The form sys_outbound_http_log.do is a new record, not the list of calls.
Look for a row whose hostname is the Kibana host:
- No Kibana row, and System Logs → Errors shows
ProcessingException. The REST message Name is notElastic Workflows, or the HTTP method Name is notpost. - No Kibana row and no error. The incident script returned before the REST call. On an update, a watched field has to change. A journal-only save does not call Kibana.
- An update starts
servicenow_search.incident_created. When is async. Set it to after and detect the insert withcurrent.operation() == 'insert'only. An async rule has nopreviousobject, so treating an emptypreviousas an insert labels every save as created. - A connection error. The endpoint is not reachable from the ServiceNow instance. Use a public host, and set
server.publicBaseUrlto that host. - HTTP 404. The ingest token does not match the connector, or Receive events was not saved before the token was rotated.
- HTTP 202. Kibana accepted the event. The workflow must be enabled and subscribed to that event id, such as
servicenow_search.incident_created.
Rows for signaldc.service-now.com are ServiceNow telemetry. A response status of -1 on those rows is not a Kibana response.
This workflow runs for servicenow_search.incident_created when the priority is 1. Replace <connector-id> with the connector instance id. For another space, use the webhook URL copied from that space's connector.
name: Notify on a new priority 1 incident
enabled: true
triggers:
- type: servicenow_search.incident_created
connector-id: <connector-id>
on:
condition: "event.priority:1"
steps:
- name: log_incident
type: console
with:
message: "Incident {{ event.number }} was created: {{ event.summary }}"
POST this body to the ingest URL. It starts servicenow_search.incident_created with number INC0010001, summary VPN is down, and priority 1.
curl -X POST \
'https://<kibana-host>/api/actions/events/.servicenow_search/<connector-id>' \
-H 'Authorization: Bearer <ingest-token>' \
-H 'Content-Type: application/json' \
-d '{
"occurrence": "incident.created",
"table": "incident",
"sys_id": "46b66a40a9fe198101d44d884e7d3a1a",
"number": "INC0010001",
"summary": "VPN is down",
"state": "1",
"priority": "1",
"assignment_group": "group-1",
"assigned_to": "user-1",
"sys_updated_on": "2026-01-01 12:00:00"
}'