# Upload a new photo

Upload a single photo for a given location. This endpoint accepts multipart/form-data with a binary photo file.

Endpoint: POST /photos
Version: 20260701
Security: X-API-KEY, Authorization

## Request fields (multipart/form-data):

  - `locationId` (integer, required)
    The uberall unique id of the location to attach the photo to
    Example: 12345

  - `photo` (string, required)
    Binary image file to upload

  - `identifier` (string)
    Client-defined identifier. Must be unique per location

  - `type` (string)
    Photo type, if not defined defaults to PHOTO
    Enum: "MAIN", "DOCTOR_COM_PORTRAIT", "LOGO", "STOREFINDER_LOGO", "SQUARED_LOGO", "LANDSCAPE", "STOREFINDER_COVER", "FACEBOOK_LANDSCAPE", "APPLE_LANDSCAPE", "MENU", "PHOTO", "ROOMS", "TEAMS", "AT_WORK", "PRODUCT", "EXTERIOR", "INTERIOR", "COMMON_AREA", "FOOD_AND_DRINK"

  - `description` (string)
    Optional caption/description

  - `order` (integer)
    Zero-based insertion index; if omitted, photo is added to the end

  - `cropOffsetX` (integer)
    Horizontal crop offset in pixels

  - `cropOffsetY` (integer)
    Vertical crop offset in pixels

  - `cropHeight` (integer)
    Crop height in pixels

  - `cropWidth` (integer)
    Crop width in pixels

  - `main` (boolean)
    Legacy flag for setting main photo. Use type=MAIN instead.

  - `logo` (boolean)
    Legacy flag for setting logo. Use type=LOGO instead.

## Response 200 fields (application/json):

  - `status` (string, required)
    Enum: "SUCCESS", "PENDING", "QUOTA_LIMIT_EXCEED", "NOT_AUTHORIZED", "FORBIDDEN", "BAD_ACCESS_TOKEN", "BAD_PRIVATE_KEY", "BAD_PUBLIC_KEY", "MISSING_PARAMETER", "INVALID_PARAMETER", "WRONG_PARAMETER_TYPE", "CONFLICT", "RESOURCE_LOCKED", "SERVER_ERROR", "ERROR", "NOT_FOUND", "BAD_REQUEST", "USER_ERROR", "PARTIAL_ERROR", "SERVICE_TEMPORARILY_UNAVAILABLE"

  - `message` (string)
    (optional) Holds further information about the response

  - `warnings` (array)
    (optional) Holds further warnings

  - `response` (object, required)
    The actual response object of the response

  - `response.photo` (object)
    Location photo response model

  - `response.photo.id` (integer)
    The uberall unique id for the photo

  - `response.photo.dateCreated` (string)
    The date when the object was created in uberall database

  - `response.photo.repoKey` (string)
    File name

  - `response.photo.locationId` (integer)
    The uberall unique id of this photo's location

  - `response.photo.description` (string)
    A description for the photo

  - `response.photo.identifier` (string)
    The photo identifier based on your internal identification system

  - `response.photo.main` (boolean)
    A boolean indicating whether this photo is the location's main photo. Maximum one per location

  - `response.photo.logo` (boolean)
    A boolean indicating whether this photo is the location's logo. Maximum one logo per location

  - `response.photo.type` (string, required)
    Required - One of: 
MAIN 
LOGO 
SQUARED_LOGO 
DOCTOR_COM_PORTRAIT - Doctor.com clients only 
LANDSCAPE - Updates Google Cover Photo
APPLE_LANDSCAPE 
PHOTO  
STOREFINDER_LOGO - Only for Uberall locator product 
STOREFINDER_COVER - Only for Uberall locator product
FACEBOOK_LANDSCAPE - Facebook Cover Photo 
EXTERIOR - Google's Exterior Photo tag - availability dependent on a location's business category 
INTERIOR - Google's Interior Photo tag  - availability dependent on a location's business category 
FOOD_AND_DRINK - Google's Food and Drink Photo tag - availability dependent on a location's business category  
MENU  - Google's Menu Photo tag, which should only be photos of the menu - availability dependent on a location's business category 
PRODUCT  - Google's Product Photo tag - availability dependent on a location's business category 
TEAMS  - Google's Teams Photo tag - availability dependent on a location's business category 
AT_WORK  - Google's At Work Photo tag - availability dependent on a location's business category 
COMMON_AREA  - Google's Common Area Photo tag - availability dependent on a location's business category 
ROOMS - Google's Rooms Photo tag - availability dependent on a location's business category

  - `response.photo.url` (string)
    The URL of the photo

  - `response.photo.publicUrl` (string)
    A public url for this photo

  - `response.photo.thumbnailUrl` (string)
    Url for the image thumbnail

  - `response.photo.cropOffsetX` (integer)
    Horizontal pixel offset of the top-left corner of the cropped area [LANDSCAPE photo only]

  - `response.photo.cropOffsetY` (integer)
    Vertical pixel offset of the top-left corner of the cropped area [LANDSCAPE photo only]

  - `response.photo.cropWidth` (integer)
    Width of the 16:9 cropped area [LANDSCAPE photo only]

  - `response.photo.cropHeight` (integer)
    Height of the 16:9 cropped area [LANDSCAPE photo only]

  - `response.photo.sourceUrl` (string)
    The client supplied url for a photo

## Response 400 fields (application/json):

  - `status` (string, required)
    Enum: "SUCCESS", "PENDING", "QUOTA_LIMIT_EXCEED", "NOT_AUTHORIZED", "FORBIDDEN", "BAD_ACCESS_TOKEN", "BAD_PRIVATE_KEY", "BAD_PUBLIC_KEY", "MISSING_PARAMETER", "INVALID_PARAMETER", "WRONG_PARAMETER_TYPE", "CONFLICT", "RESOURCE_LOCKED", "SERVER_ERROR", "ERROR", "NOT_FOUND", "BAD_REQUEST", "USER_ERROR", "PARTIAL_ERROR", "SERVICE_TEMPORARILY_UNAVAILABLE"

  - `message` (string)
    (optional) Holds further information about the response

  - `errorCode` (string)
    Enum: "NORMALIZATION_FAILED", "DATA_CORRUPTED", "INVALID_INPUT", "NOT_SYNCABLE", "PAYMENT_FAILED", "FREE_TIER_REACHED", "LIMIT_REACHED", "INACTIVE", "UNKNOWN", "IDENTIFIER_NOT_UNIQUE", "ACCOUNT_WAITING_FOR_AUTO_PAGE_SELECT", "NO_ACCOUNT_CONNECTED", "NO_PAGE_SELECTED", "PAGE_NOT_CREATED", "PAGE_IN_REVIEW", "PAGE_CLAIMED_BY_OTHERS", "OVERLAPPING_SOCIALPOST", "TOO_MANY_REPLIES", "REPLY_TOO_LONG", "DEPRECATED"

  - `response` (object)
    (optional) The actual response object of the response

## Response 401 fields (application/json):

  - `status` (string, required)
    Enum: "SUCCESS", "PENDING", "QUOTA_LIMIT_EXCEED", "NOT_AUTHORIZED", "FORBIDDEN", "BAD_ACCESS_TOKEN", "BAD_PRIVATE_KEY", "BAD_PUBLIC_KEY", "MISSING_PARAMETER", "INVALID_PARAMETER", "WRONG_PARAMETER_TYPE", "CONFLICT", "RESOURCE_LOCKED", "SERVER_ERROR", "ERROR", "NOT_FOUND", "BAD_REQUEST", "USER_ERROR", "PARTIAL_ERROR", "SERVICE_TEMPORARILY_UNAVAILABLE"

  - `message` (string)
    (optional) Holds further information about the response

  - `errorCode` (string)
    Enum: "NORMALIZATION_FAILED", "DATA_CORRUPTED", "INVALID_INPUT", "NOT_SYNCABLE", "PAYMENT_FAILED", "FREE_TIER_REACHED", "LIMIT_REACHED", "INACTIVE", "UNKNOWN", "IDENTIFIER_NOT_UNIQUE", "ACCOUNT_WAITING_FOR_AUTO_PAGE_SELECT", "NO_ACCOUNT_CONNECTED", "NO_PAGE_SELECTED", "PAGE_NOT_CREATED", "PAGE_IN_REVIEW", "PAGE_CLAIMED_BY_OTHERS", "OVERLAPPING_SOCIALPOST", "TOO_MANY_REPLIES", "REPLY_TOO_LONG", "DEPRECATED"

  - `response` (object)
    (optional) The actual response object of the response

## Response 403 fields (application/json):

  - `status` (string, required)
    Enum: "SUCCESS", "PENDING", "QUOTA_LIMIT_EXCEED", "NOT_AUTHORIZED", "FORBIDDEN", "BAD_ACCESS_TOKEN", "BAD_PRIVATE_KEY", "BAD_PUBLIC_KEY", "MISSING_PARAMETER", "INVALID_PARAMETER", "WRONG_PARAMETER_TYPE", "CONFLICT", "RESOURCE_LOCKED", "SERVER_ERROR", "ERROR", "NOT_FOUND", "BAD_REQUEST", "USER_ERROR", "PARTIAL_ERROR", "SERVICE_TEMPORARILY_UNAVAILABLE"

  - `message` (string)
    (optional) Holds further information about the response

  - `errorCode` (string)
    Enum: "NORMALIZATION_FAILED", "DATA_CORRUPTED", "INVALID_INPUT", "NOT_SYNCABLE", "PAYMENT_FAILED", "FREE_TIER_REACHED", "LIMIT_REACHED", "INACTIVE", "UNKNOWN", "IDENTIFIER_NOT_UNIQUE", "ACCOUNT_WAITING_FOR_AUTO_PAGE_SELECT", "NO_ACCOUNT_CONNECTED", "NO_PAGE_SELECTED", "PAGE_NOT_CREATED", "PAGE_IN_REVIEW", "PAGE_CLAIMED_BY_OTHERS", "OVERLAPPING_SOCIALPOST", "TOO_MANY_REPLIES", "REPLY_TOO_LONG", "DEPRECATED"

  - `response` (object)
    (optional) The actual response object of the response

## Response 404 fields (application/json):

  - `status` (string, required)
    Enum: "SUCCESS", "PENDING", "QUOTA_LIMIT_EXCEED", "NOT_AUTHORIZED", "FORBIDDEN", "BAD_ACCESS_TOKEN", "BAD_PRIVATE_KEY", "BAD_PUBLIC_KEY", "MISSING_PARAMETER", "INVALID_PARAMETER", "WRONG_PARAMETER_TYPE", "CONFLICT", "RESOURCE_LOCKED", "SERVER_ERROR", "ERROR", "NOT_FOUND", "BAD_REQUEST", "USER_ERROR", "PARTIAL_ERROR", "SERVICE_TEMPORARILY_UNAVAILABLE"

  - `message` (string)
    (optional) Holds further information about the response

  - `errorCode` (string)
    Enum: "NORMALIZATION_FAILED", "DATA_CORRUPTED", "INVALID_INPUT", "NOT_SYNCABLE", "PAYMENT_FAILED", "FREE_TIER_REACHED", "LIMIT_REACHED", "INACTIVE", "UNKNOWN", "IDENTIFIER_NOT_UNIQUE", "ACCOUNT_WAITING_FOR_AUTO_PAGE_SELECT", "NO_ACCOUNT_CONNECTED", "NO_PAGE_SELECTED", "PAGE_NOT_CREATED", "PAGE_IN_REVIEW", "PAGE_CLAIMED_BY_OTHERS", "OVERLAPPING_SOCIALPOST", "TOO_MANY_REPLIES", "REPLY_TOO_LONG", "DEPRECATED"

  - `response` (object)
    (optional) The actual response object of the response

## Response 409 fields (application/json):

  - `status` (string, required)
    Enum: "SUCCESS", "PENDING", "QUOTA_LIMIT_EXCEED", "NOT_AUTHORIZED", "FORBIDDEN", "BAD_ACCESS_TOKEN", "BAD_PRIVATE_KEY", "BAD_PUBLIC_KEY", "MISSING_PARAMETER", "INVALID_PARAMETER", "WRONG_PARAMETER_TYPE", "CONFLICT", "RESOURCE_LOCKED", "SERVER_ERROR", "ERROR", "NOT_FOUND", "BAD_REQUEST", "USER_ERROR", "PARTIAL_ERROR", "SERVICE_TEMPORARILY_UNAVAILABLE"

  - `message` (string)
    (optional) Holds further information about the response

  - `errorCode` (string)
    Enum: "NORMALIZATION_FAILED", "DATA_CORRUPTED", "INVALID_INPUT", "NOT_SYNCABLE", "PAYMENT_FAILED", "FREE_TIER_REACHED", "LIMIT_REACHED", "INACTIVE", "UNKNOWN", "IDENTIFIER_NOT_UNIQUE", "ACCOUNT_WAITING_FOR_AUTO_PAGE_SELECT", "NO_ACCOUNT_CONNECTED", "NO_PAGE_SELECTED", "PAGE_NOT_CREATED", "PAGE_IN_REVIEW", "PAGE_CLAIMED_BY_OTHERS", "OVERLAPPING_SOCIALPOST", "TOO_MANY_REPLIES", "REPLY_TOO_LONG", "DEPRECATED"

  - `response` (object)
    (optional) The actual response object of the response

