I had to rely on an existing answer, but modify it as the formatting wasn't working for me. ```python import bpy selected_obj = bpy.context.selected_objects selected_obj.remove(bpy.context.active_object) active_obj = bpy.context.active_object shapekey_list_string = str(active_obj.data.shape_keys.key_blocks.keys()).lower() for obj in selected_obj: for key in obj.data.shape_keys.key_blocks: if key.name.lower().lstrip(obj.name.lower()) in shapekey_list_string: if not key.name == "Basis": skey_driver = key.driver_add('value') skey_driver.driver.type = 'AVERAGE' if skey_driver.driver.variables: for v in skey_driver.driver.variables: skey_driver.driver.variables.remove(v) newVar = skey_driver.driver.variables.new() newVar.name = "value" newVar.type = 'SINGLE_PROP' newVar.targets[0].id_type = 'KEY' newVar.targets[0].id = active_obj.data.shape_keys newVar.targets[0].data_path = 'key_blocks["' + key.name.lstrip(obj.name.lower())+ '"].value' skey_driver.driver.type = 'AVERAGE' if skey_driver.driver.variables: for v in skey_driver.driver.variables: skey_driver.driver.variables.remove(v) newVar = skey_driver.driver.variables.new() newVar.name = "hide" newVar.type = 'SINGLE_PROP' newVar.targets[0].id_type = 'KEY' newVar.targets[0].id = active_obj.data.shape_keys newVar.targets[0].data_path = 'key_blocks["' + key.name.lstrip(obj.name.lower())+ '"].value' ``` The part that seems the hardest to research on API documentation alone is the argument following newVar. I'd like to contextualize that to help others not get as caught up as I had: newVar = obj.data.shape_keys.key_blocks['Key'].driver_add.driver.variables.new() newVar.name newVar.type .name and .type represent the variables of the key_block itself: ["Morph.Upperarms.Shoulder"] Whereas, following that: newVar.targets[0].id_type newVar.targets[0].id newVar.targets[0].data_path These represent: 1. 'KEY' (As in "Key' or 'Key.001' in my sample question.) 2. Source Object: bpy.data.objects['Source_Mesh'].data.shape_keys This represents the object containing the key in item 1. 3. Data Path: This represents the exact name you would see were you to copy the shape key as driver and paste it into the "Path" field of the driver editor. Specifically, not knowing the formatting of this argument, or understanding how the key, key's owner, and data path were separately defined, was what made this solution take hours to find, despite many similar questions being available. [original post used as basis for solution][1] [1]: https://blender.stackexchange.com/questions/86757/python-how-to-connect-shapekeys-via-drivers