To simplify things, here is a script that works without any changes in both Slicer-4.11 and Slicer-4.13:
extensionName = 'SlicerIGT'
em = slicer.app.extensionsManagerModel()
if not em.isExtensionInstalled(extensionName):
extensionMetaData = em.retrieveExtensionMetadataByName(extensionName)
if slicer.app.majorVersion*100+slicer.app.minorVersion < 413:
# Slicer-4.11
itemId = extensionMetaData['item_id']
url = f"{em.serverUrl().toString()}/download?items={itemId}"
else:
# Slicer-4.13
itemId = extensionMetaData['_id']
url = f"{em.serverUrl().toString()}/api/v1/item/{itemId}/download"
extensionPackageFilename = slicer.app.temporaryPath+'/'+itemId
slicer.util.downloadFile(url, extensionPackageFilename)
em.installExtension(extensionPackageFilename)
slicer.util.restart()