GAPI

Форма ответа

От каждой платформы приходит один и тот же объект. Неприменимые поля возвращаются как null, а не пропадают, поэтому вашему парсеру не нужно проверять наличие ключа.

Какие поля есть всегда, какие необязательны, а какие остаются null

Верхний уровень

ПолеТипПримечания
platformstringЕсть всегда — сеть, из которой пришла ссылка
typestringvideo, image, album или audio
titlestring | nullПодпись поста, если она есть
authorstring | nullЗаполняется, если источник это отдаёт; у Instagram null
thumbnailstring | nullПревью; для каруселей Instagram не возвращается
durationnumber | nullСекунды, если источник их сообщает
mediaarrayЕсть всегда, минимум один элемент

Внутри media

ПолеТипПримечания
typestringvideo, image или audio
urlstringПрямая ссылка на файл — есть всегда
qualitystring | nullЗаполняется, когда есть несколько вариантов, например 720p
extstring | nullРасширение файла, если источник его сообщает

Как под это писать

data = response.json()

if data["type"] == "album":
    print(len(data["media"]), "files")

for item in data["media"]:
    download(item["url"])