Из документации API, если смотреть метод photos.saveMarketPhoto, обязательные параметры: photo, server, hash.
Но после последовательных вызовов photos.getMarketUploadServer -> Загрузка CURL'ом изображения -> photos.saveMarketPhoto -> market.add с параметрами owner_id, name, description, category_id, price, deleted, main_photo_id, photo_ids - приходит аналогичный ответ от сервера API: One of the parameters specified was missing or invalid: invalid photo crop.
Вообще странное поведение сервиса, то-ли документация неверно описывает функционал, то-ли проблемы в логике самого сервера API.
P.S. Мне показалось странным решением использование разных методов для получения сервера для загрузки/сохранения изображений, да и вообще безапелляционное изменение названий возвращаемых/передаваемых полей.
При Дурове такой х-ни не было.