От каждой платформы приходит один и тот же объект. Неприменимые поля возвращаются как null, а не пропадают, поэтому вашему парсеру не нужно проверять наличие ключа.
Верхний уровень
Поле
Тип
Примечания
platform
string
Есть всегда — сеть, из которой пришла ссылка
type
string
video, image, album или audio
title
string | null
Подпись поста, если она есть
author
string | null
Заполняется, если источник это отдаёт; у Instagram null
thumbnail
string | null
Превью; для каруселей Instagram не возвращается
duration
number | null
Секунды, если источник их сообщает
media
array
Есть всегда, минимум один элемент
Внутри media
Поле
Тип
Примечания
type
string
video, image или audio
url
string
Прямая ссылка на файл — есть всегда
quality
string | null
Заполняется, когда есть несколько вариантов, например 720p
ext
string | null
Расширение файла, если источник его сообщает
Как под это писать
data = response.json()
if data["type"] == "album":
print(len(data["media"]), "files")
for item in data["media"]:
download(item["url"])