So I think the issue is that you didn’t set “protocol” which caused LXD to default to its native protocol. The remote image server supports that too, but then the alias is “ubuntu/xenial/amd64” rather than “ubuntu/xenial” which is only valid with simplestreams.
Thanks, that’s it. Also, I used source instead of server to specify the image server, which did work with a fingerprint, so no idea what’s the difference here. (edit: Just realized source is probably something completely different, because I already have the image with the fingerprint on disk). Some more documentation of the types in shared/api would be lovely.