Skip to main content
Version: 10.0

Create, Get, Update, and Delete Block List

This sample code has basic functions for manipulating block lists. It logs in to rWeb, finds the target zone and creates two block list entries under that zone. Then after retrieving a list of block lists, it deletes the second entry before logging out.

#!/usr/bin/env -S uv run --script
# /// script
# requires-python = ">=3.12"
# dependencies = [
# "requests",
# ]
# ///
import requests
import json
import urllib.parse as urlparse

# Enter your rWeb address here
BASE_URL = "https://rweb11.local.riorey.com"

HEADERS = {'Content-Type': 'application/json',
'Accept': 'application/json'}

# Put in your user credentials here
CREDENTIALS = {'login':'admin', 'password':'admin123'}


def wrap(data):
return json.dumps({'data': data})

def url(resource, params=None):
querystring = ""
if params != None:
querystring = "?"+urlparse.urlencode(params)

return BASE_URL + resource + querystring

def login(session):
result = session.post(url('/authentication'),
wrap(CREDENTIALS))
assert(result.status_code == requests.codes.created)

def logout(session):
session.delete(url('/authentication'))

def find_group(session, name):
result = session.get(url('/groups', {'name':name}))
assert(result.status_code == requests.codes.ok)
group_list = json.loads(result.content)
assert(group_list['rows']==1)
return group_list['data'][0]

def find_zone(session, group, name):
result = session.get(url(group['zones_resource'],{'name':name}))
assert(result.status_code == requests.codes.ok)
zone_list = json.loads(result.content)
assert(zone_list['rows']==1)
return zone_list['data'][0]

def find_revision_blocklist_resource(session, zone):
current = find_current_revision(session, zone)
blocklist_resource = current['block_list_resource']
return blocklist_resource

def find_current_revision(session, zone):
result = session.get(url(zone['revision_current_resource']))
current = json.loads(result.content)
return current

def add_blocklist(session, zone, params):
blocklist_url = url(find_revision_blocklist_resource(session, zone))
payload = wrap(params)
result = session.post(blocklist_url, payload)

if result.status_code == 422:
print("⚠ Some entries already exist (duplicates), skipping...")
return

assert(result.status_code in [requests.codes.created, 202]) # Accept both 201 and 202

def delete_blocklist(session, resource):
result = session.delete(url(resource))
assert(result.status_code == requests.codes.ok)

def get_blocklists(session, zone):
result = session.get(url(find_revision_blocklist_resource(session, zone)))
block_lists = json.loads(result.content)
return block_lists['data']

def update_blocklist(session, resource, params):
result = session.put(url(resource), wrap(params))
assert(result.status_code == requests.codes.ok)

def main():
with requests.session() as session:
session.headers = HEADERS
# This is insecure but may be needed if you haven't set up an SSL certificate for rWeb yet
session.verify = False
login(session)

group = find_group(session, 'Default')
zone = find_zone(session, group, 'Test')

try:
add_blocklist(session, zone,
{'imported': True,
'array':[
{'data': '213.254.1.179',
'list_type': 'prefix',
'expiry_time': '2027-06-15T12:00:00Z',
'description': 'testing'},
{'data': 'AS38901',
'list_type': 'asn',
'expiry_time': '2026-06-15T12:00:00Z',
'description': 'testing'}]})
except AssertionError as e:
print(f"⚠ add_blocklist assertion failed: {e}")

blocklists = get_blocklists(session, zone)

if isinstance(blocklists, list) and len(blocklists) > 1:
blocklist = blocklists[1]
delete_blocklist(session, blocklist['block_list_resource'])

logout(session)
print("\n✓ Script completed successfully!")

if __name__ == '__main__':
main()