Python web services client examples

  • Release version: Zurich
  • Updated July 31, 2025
  • 4 minutes to read
  • Summarize
    Summarized using AI
    This content was generated using new OpenAI-powered functionality. Results are provided on an as is basis and are not guaranteed to be accurate or complete.

    Summary of Python web services client examples

    This documentation provides practical examples for ServiceNow customers on how to integrate with ServiceNow using a Python web services client. It focuses on using the SOAPpy Python module to interact with ServiceNow SOAP APIs for managing incidents and ECC queue records. The examples demonstrate essential operations such as inserting incidents, retrieving incidents by criteria or sysid, and an advanced use case that monitors log files and creates ECC queue records based on log content.

    Show full answer Show less

    Key Features

    • Requirements: Python modules fpconst, PyXML, and SOAPpy must be installed to run the examples.
    • Inserting an Incident: Shows how to create an incident record by calling the insert method with parameters like impact, urgency, priority, category, location, caller ID, assignment group, assigned to, short description, and comments.
    • Retrieving Incident Keys: Demonstrates using the getKeys method to query incidents by category and retrieve sysids.
    • Retrieving Incident Records: Illustrates how to get full incident records filtered by a category using the getRecords method.
    • Retrieving an Incident by sysid: Shows how to fetch a specific incident record by its unique sysid using the get method.
    • Advanced ECC Queue Integration: Provides an example Python script that monitors a log file for specific keywords (e.g., "invalid spi"), tracks its position between runs, and creates ECC queue records with XML payloads for each matched log line. This example includes error handling for log file access and uses detailed SOAP calls to insert ECC queue entries.

    Practical Application for ServiceNow Customers

    • These examples enable customers to automate incident management tasks by integrating Python scripts with ServiceNow’s SOAP web services.
    • By following the examples, customers can create, query, and retrieve incident records programmatically, improving efficiency and integration with external systems.
    • The advanced example helps customers implement automated monitoring and alerting workflows by sending critical log events into ServiceNow’s ECC queue for further processing and orchestration.
    • Users must update the instance name, username, and password in each script to match their ServiceNow environment and ensure secure HTTPS endpoints are used as recommended.

    Overall, these Python client examples empower ServiceNow customers to extend platform capabilities through script-based automation and integration leveraging SOAP APIs.

    Examples demonstrating an integration with a Python web services client.

    Requirements

    The following examples require the installation of the following Python modules:

    insert

    This is an example of inserting an incident.
    #!/usr/bin/python
     
     from SOAPpy  import SOAPProxy
     import sys
     
     def createincident (params_dict ):
     
             # instance to send to
            instance = 'demo'
     
             # username/password
            username = 'itil'
            password = 'itil'
     
     
             # proxy - NOTE: ALWAYS use https://INSTANCE.service-now.com, not https://www.service-now.com/INSTANCE for web services URL from now on!
            proxy  = 'https://%s:%s@%s.service-now.com/incident.do?SOAP' %  (username , password , instance )
            namespace  = 'http://www.service-now.com/'
            server  = SOAPProxy (proxy , namespace )
     
             # uncomment these for LOTS of debugging output #server.config.dumpHeadersIn = 1 #server.config.dumpHeadersOut = 1 #server.config.dumpSOAPOut = 1 #server.config.dumpSOAPIn = 1
     
            response  = server. insert (impact = int (params_dict [ 'impact' ] ) , urgency = int (params_dict [ 'urgency' ] ) , priority = int (params_dict [ 'priority' ] ) , category =params_dict [ 'category' ] , location =params_dict [ 'location' ] , caller_id =params_dict [ 'user' ] , assignment_group =params_dict [ 'assignment_group' ] , assigned_to =params_dict [ 'assigned_to' ] , short_description =params_dict [ 'short_description' ] , comments =params_dict [ 'comments' ] )
     
             return response
     
    values  = { 'impact':  '1' , 'urgency':  '1' , 'priority':  '1' , 'category':  'High' , 'location':  'San Diego' , 'user':  'fred.luddy@yourcompany.com' , 'assignment_group':  'Technical Support' , 'assigned_to':  'David Loo' , 'short_description':  'An incident created using python, SOAPpy, and web services.' , 'comments':  'This a test making an incident with python.\n Isn \' t life wonderful?' }
     
    new_incident_sysid =createincident (values )
     
     print "Returned sysid: "+ repr (new_incident_sysid )

    getKeys

    This is an example of executing getKeys on the demo instance using basic authentication.
    #!/bin/env python
     
     # use the SOAPpy module from SOAPpy  import SOAPProxy
     
    username , password , instance  = 'admin' , 'admin' , 'demo'
    proxy , namespace  = 'https://username:password@www.service-now.com/'+instance+ '/incident.do?SOAP' , 'http://www.service-now.com/'
     
    server  = SOAPProxy (proxy ,namespace )
    response  = server. getKeys (category  = 'Network' )
     
     print response. sys_id. split ( ',' )

    getRecords

    In this example, we get an incident, querying for category == "Network" (with basic authentication).
    #!/bin/env python
     
     # use the SOAPpy module from SOAPpy  import SOAPProxy
     
    username , password , instance  = 'admin' , 'admin' , 'demo'
    proxy , namespace  = 'https://username:password@www.service-now.com/'+instance+ '/incident.do?SOAP' , 'http://www.service-now.com/'
     
    server  = SOAPProxy (proxy ,namespace )
    response  = server. getRecords (category  = 'Network' )
     
     for record  in response:
    	 for item  in record:
    		 print item

    get

    In this example, we get an incident record by sys_id (with basic authentication).
    #!/bin/env python
     
     # use the SOAPpy module from SOAPpy  import SOAPProxy
     
    username , password , instance  = 'admin' , 'admin' , 'demo'
    proxy , namespace  = 'https://username:password@www.service-now.com/'+instance+ '/incident.do?SOAP' , 'http://www.service-now.com/'
     
    server  = SOAPProxy (proxy ,namespace )
    response  = server. get (sys_id  = '9c573169c611228700193229fff72400' )
     
     for each  in response:
    	 print each

    Advanced

    This is an example of advanced Python script that reads a log file for a keyword invalid spi and creates an ECC Queue record where the payload is set to an alert of XML format.
    #!/bin/env python
     
     # kevin.pickard@service-now.com			2008.07.03		initial creation
     
     from SOAPpy  import SOAPProxy
     from xml. dom. minidom import getDOMImplementation
     import sys , os , socket , pickle , re
     
     # instance to send to
    instance = 'demo'
     
     # username/pass
    username = 'admin'
    password = 'admin'
     
     # log file to watch
    syslogfile = '/var/log/cisco.log.ksp'
     
     # state file
    statefile = '/tmp/syslog_ecc.state-test'
     
     # ECC queue values
    soapagent = 'SOAPpy'
    ecctopic = 'PIX Error: '
    eccname = 'Invalid SPI: '
    eccsource = 'Syslog'
     
     # regex string to match
    matchstring = 'invalid spi'
     
     try:
    	state = open (statefile , 'r' )
    	lastbyte = pickle. load (state )
    	state. close ( ) except:
    	lastbyte = 0
     
     #print 'DEBUG: lastbyte = '+str(lastbyte)
     
     try:
    	log = open (syslogfile , 'ro' ) except:
    	errortopic = 'Script Error'
    	errorname = 'Unable to open log file '+syslogfile+ '.'
    	errorpayload = 'This message was generated due to an error condition encountered in a script.  The name of the script is '+ os. path. basename ( sys. argv [ 0 ] )+ ' on server '+ socket. gethostname ( )+ '.'
     
    	proxy  = 'https://'+username+ ':'+password+ '@'+instance+ '.service-now.com/ecc_queue.do?SOAP'
    	namespace  = 'http://www.service-now.com/'
    	server  = SOAPProxy (proxy , namespace )
    	server. config. dumpSOAPOut = 1 
    	server. config. dumpSOAPIn = 1 
            response  = server. insert (agent =soapagent , topic =errortopic , name =errorname , source = sys. argv [ 0 ] , payload =errorpayload )
     
    	 sys. exit ( 1 )
     
     if lastbyte  != 0:
    	 try:
    		log. seek (lastbyte ) except IOError:
    		 pass
     
    loglines =log. readlines ( )
     
    lastbyte =log. tell ( )
     
    log. close ( )
     
    state = open (statefile , 'w' ) pickle. dump (lastbyte , state )
    state. close ( )
     
     # regex out the line
    matchedlines = [ ] for line  in loglines:
    	 if re. search (matchstring , line ) != None:
    		matchedlines. append (line )
     
     #print 'DEBUG: len->loglines = '+str(len(loglines)) #print 'DEBUG: lastbyte = '+str(lastbyte) #print 'DEBUG: matchedlines = '+str(matchedlines)
     
     if len (matchedlines ) == 0:
    	 sys. exit ( 0 )
     
    proxy  = 'https://'+username+ ':'+password+ '@'+instance+ '.service-now.com/ecc_queue.do?SOAP'
    namespace  = 'http://www.service-now.com/'
     
    server  = SOAPProxy (proxy , namespace ) #server.config.dumpSOAPOut = 1 #server.config.dumpSOAPIn = 1
     
    entriestosend = { } for line  in matchedlines:
    	device =line. split ( ) [ 3 ]
    	sourceip =line. split ( ) [- 1 ]
    	entriestosend [sourceip ] = [device , line ]
     
     for key ,value  in entriestosend. iteritems ( ):
    	 #impl=getDOMImplementation() #newdoc = impl.createDocument(None, "log_line", None) #top_element = newdoc.documentElement #text = newdoc.createTextNode(value[1]) #top_element.appendChild(text)
     
    	response  = server. insert (agent =soapagent , topic =ecctopic+value [ 0 ] , name =eccname+key , source =eccsource , payload =value [ 1 ] )