> Portal Navigation:
> 
> - Append `.md` to any URL under `https://dev.wix.com/docs/` to get its markdown version.
> - Pages are either content pages (article or reference text) or menu pages (a list of links to child pages).
> - To get a menu page, truncate any URL to a parent path and append `.md` (e.g. `https://dev.wix.com/docs/sdk.md`, `https://dev.wix.com/docs/sdk/core-modules.md`).
> - Top-level index of all portals: https://dev.wix.com/docs/llms.txt
> - Full concatenated docs: https://dev.wix.com/docs/llms-full.txt

# ListMediaUploads

# Package: googleBusinessProfile

# Namespace: MediaUploadService

# Method link: https://dev.wix.com/docs/api-reference/business-management/google-business-profile/media-upload-v1/list-media-uploads.md

## Permission Scopes:
Manage SEO Settings: SCOPE.PROMOTE.MANAGE-SEO

## Introduction

Retrieves the photo changes still queued or failed for a location.

This is how you follow an asynchronous submission, since there's no
completion callback. Read the response as a whole rather than item by item:

- Anything `PENDING` or `UPLOADING` means the queue is still working. Don't
report results yet.
- Only `FAILED` items means the queue finished and those items didn't make
it.
- An empty response means nothing is outstanding for this location.

Read that last one carefully, because it's weaker than it looks. It tells you
the queue is empty, not that a particular submission succeeded. A successful
change leaves nothing behind, and so does a failure that's been cleared, and
the two are indistinguishable afterwards. Google's own media list is the
record of what's actually live, so confirm against List Media rather than
inferring success from an empty queue.

Failures are cleared for the whole location by the next call to Bulk Create
Media Uploads, whoever makes it. If more than one app manages the same
location, one app queuing a change clears failures the other hasn't read yet.
Read failures before queuing again, and don't treat an empty response as
proof that your own submission worked.

You can also use this to show a gallery matching what the site owner asked
for while the queue is still working, because Google's list lags behind in
both directions. Count only changes still on their way, since a `FAILED`
addition never reached Google:

```
gallery = Google's media list
+ additions still PENDING or UPLOADING
- removals still PENDING or UPLOADING
```

The response is never paged and never truncated. It returns the complete set
or fails with `FAILED_PRECONDITION`.

---

## REST API

### Schema

```
 Method: listMediaUploads
 Description: Retrieves the photo changes still queued or failed for a location.  This is how you follow an asynchronous submission, since there's no completion callback. Read the response as a whole rather than item by item:  - Anything `PENDING` or `UPLOADING` means the queue is still working. Don't report results yet. - Only `FAILED` items means the queue finished and those items didn't make it. - An empty response means nothing is outstanding for this location.  Read that last one carefully, because it's weaker than it looks. It tells you the queue is empty, not that a particular submission succeeded. A successful change leaves nothing behind, and so does a failure that's been cleared, and the two are indistinguishable afterwards. Google's own media list is the record of what's actually live, so confirm against List Media rather than inferring success from an empty queue.  Failures are cleared for the whole location by the next call to Bulk Create Media Uploads, whoever makes it. If more than one app manages the same location, one app queuing a change clears failures the other hasn't read yet. Read failures before queuing again, and don't treat an empty response as proof that your own submission worked.  You can also use this to show a gallery matching what the site owner asked for while the queue is still working, because Google's list lags behind in both directions. Count only changes still on their way, since a `FAILED` addition never reached Google:  ``` gallery = Google's media list + additions still PENDING or UPLOADING - removals still PENDING or UPLOADING ```  The response is never paged and never truncated. It returns the complete set or fails with `FAILED_PRECONDITION`.
 URL: https://www.wixapis.com/gbp/v1/locations/{locationId}/media-uploads
 Method: GET
 # Note: If the parameter `a.b` is listed under required parameters, `b` is only required if `a` is also present.
 Required parameters:  locationId
 Method parameters: 
   param name: locationId | type:   none | required: true 
 Return type: ListMediaUploadsResponse
  - name: mediaUploads | type: array<MediaUpload> | description: Every outstanding change for the location, in the order it will be applied. An empty list means the queue finished and nothing failed.  Never paged and never truncated. If the set is somehow too large to return, the call fails with `FAILED_PRECONDITION` rather than returning part of it.  | validation: maxItems 500
     - name: id | type: string | description: Queued change GUID.  | read-only: true | validation: format GUID
     - name: locationId | type: string | description: GUID of the location this change applies to. This is Google's location identifier.  | validation: minLength 1, maxLength 255, immutable
     - name: batchId | type: string | description: Groups the changes queued by one Bulk Create Media Uploads call. Useful for troubleshooting, since one save can produce more than one batch.  | read-only: true | validation: format GUID
     - name: slotKey | type: string | description: Your own key for this photo: `logo`, `cover`, or `photo:<id>`.  Set it to something stable and meaningful to you. It's how a failure is matched back to the photo that caused it, and it's part of what makes a repeated submission a duplicate rather than a second change.  | validation: maxLength 255
     - name: sourceUrl | type: string | description: Publicly reachable URL Google fetches the image from. Additions only.  Keep it reachable well beyond the upload itself. A failure report renders this URL as a thumbnail, possibly weeks later.  | validation: maxLength 2048
     - name: category | type: MediaCategory | description: Where the photo appears on the profile. Additions only.  
         - enum:
         -     COVER: The banner image at the top of the profile. One per location.
         -     PROFILE: The profile image shown alongside the business name.
         -     LOGO: The business's logo. One per location.
         -     EXTERIOR: The outside of the premises, including the storefront.
         -     INTERIOR: The inside of the premises.
         -     PRODUCT: A product the business sells.
         -     AT_WORK: The team at work, such as staff serving customers.
         -     FOOD_AND_DRINK: Food or drink the business serves.
         -     MENU: The menu, for a business that serves food or drink.
         -     COMMON_AREA: A shared space, such as a lobby or a waiting area.
         -     ROOMS: Guest rooms, for accommodation businesses.
         -     TEAMS: The people who work at the business.
         -     ADDITIONAL: Anything that doesn't fit the other categories. This is the default for a gallery photo.
     - name: format | type: MediaFormat | description: Media type of the photo. Additions only.  
         - enum: PHOTO, VIDEO
     - name: operation | type: MediaUploadOperation | description: Whether this change adds a photo to the profile or removes one.  
         - enum:
         -     CREATE: Add a photo to the profile.
         -     DELETE: Remove a photo from the profile.
     - name: sequence | type: integer | description: Position in the order the queue applies changes, assigned by the server.  Every removal comes before every addition, because Google rejects new photos on a profile that's already at its limit, so the old ones have to go first. Additions then follow as logo, cover, and gallery in the order given.  | read-only: true 
     - name: state | type: MediaUploadState | description: Whether this change is waiting, being applied, or has failed.  | read-only: true 
         - enum:
         -     PENDING: Waiting its turn in the queue.
         -     UPLOADING: Being applied to Google now. A change that stays here isn't one that never ran: its outcome isn't known yet.
         -     FAILED: Failed, and won't be retried. Kept until replaced or dismissed.
     - name: attempts | type: integer | description: How many times this change has been attempted.  | read-only: true 
     - name: mediaKey | type: string | description: Google's identifier for the photo to remove. Removals only.  | validation: maxLength 255
     - name: failure | type: MediaUploadFailure | description: Why this change failed. Present only when `state` is `FAILED`.  | read-only: true 
        - name: reason | type: MediaUploadFailureReason | description: Why the change failed, in terms you can show a site owner.  
             - enum:
             -     IMAGE_TOO_SMALL: Below Google's minimum dimensions.
             -     ASPECT_RATIO_REJECTED: Cover/logo ratio outside Google's accepted range.
             -     FORMAT_UNSUPPORTED: File type Google will not accept.
             -     SOURCE_UNREACHABLE: Google could not fetch the image URL.
             -     PERMISSION_REVOKED: Access to the Google account was lost. The site owner needs to connect again.
             -     RATE_LIMIT_EXHAUSTED: Google was still rate limiting after the queue used up its retries.
             -     UPLOAD_UNVERIFIED: The change may or may not have reached Google, and the queue chose not to risk a duplicate by trying again. Additions only.  Unlike every other reason here, this doesn't say anything is wrong with the photo. It says the outcome couldn't be confirmed. Word it for the site owner that way: "we couldn't confirm this photo was added", not "this photo was rejected".
     - name: createdDate | type: string | description: Date and time the change was queued.  | read-only: true | validation: format date-time
     - name: updatedDate | type: string | description: Date and time the change was last updated.  | read-only: true | validation: format date-time
     - name: revision | type: string | description: Revision number, incremented on every update.  | read-only: true 

 Possible Errors:
   HTTP Code: 428 | Status Code: FAILED_PRECONDITION | Application Code: MEDIA_UPLOAD_LIST_TOO_LARGE | Description: none


```

### Examples

### Poll a location's queue mid-drain
One photo is still uploading, one is waiting, and one has failed. Because PENDING and UPLOADING items are present, the queue hasn't finished, so don't report results yet.

```curl
curl -X GET \
'https://www.wixapis.com/gbp/v1/locations/locations%2F8117348495523092385/media-uploads' \
-H 'Authorization: <AUTH>'
```

---

## JavaScript SDK

### Schema

```
 Method: wixClientAdmin.gbp.mediaUploads.listMediaUploads(locationId)
 Description: Retrieves the photo changes still queued or failed for a location.  This is how you follow an asynchronous submission, since there's no completion callback. Read the response as a whole rather than item by item:  - Anything `PENDING` or `UPLOADING` means the queue is still working. Don't report results yet. - Only `FAILED` items means the queue finished and those items didn't make it. - An empty response means nothing is outstanding for this location.  Read that last one carefully, because it's weaker than it looks. It tells you the queue is empty, not that a particular submission succeeded. A successful change leaves nothing behind, and so does a failure that's been cleared, and the two are indistinguishable afterwards. Google's own media list is the record of what's actually live, so confirm against List Media rather than inferring success from an empty queue.  Failures are cleared for the whole location by the next call to Bulk Create Media Uploads, whoever makes it. If more than one app manages the same location, one app queuing a change clears failures the other hasn't read yet. Read failures before queuing again, and don't treat an empty response as proof that your own submission worked.  You can also use this to show a gallery matching what the site owner asked for while the queue is still working, because Google's list lags behind in both directions. Count only changes still on their way, since a `FAILED` addition never reached Google:  ``` gallery = Google's media list + additions still PENDING or UPLOADING - removals still PENDING or UPLOADING ```  The response is never paged and never truncated. It returns the complete set or fails with `FAILED_PRECONDITION`.
 # Note: If the parameter `a.b` is listed under required parameters, `b` is only required if `a` is also present.
 Required parameters:  locationId
 Method parameters: 
   param name: locationId | type: string | description: GUID of the location. This is Google's location identifier. | required: true | validation: minLength 1, maxLength 255
 Return type: PROMISE<ListMediaUploadsResponse>
  - name: mediaUploads | type: array<MediaUpload> | description: Every outstanding change for the location, in the order it will be applied. An empty list means the queue finished and nothing failed.  Never paged and never truncated. If the set is somehow too large to return, the call fails with `FAILED_PRECONDITION` rather than returning part of it.  | validation: maxItems 500
     - name: _id | type: string | description: Queued change GUID.  | read-only: true | validation: format GUID
     - name: locationId | type: string | description: GUID of the location this change applies to. This is Google's location identifier.  | validation: minLength 1, maxLength 255, immutable
     - name: batchId | type: string | description: Groups the changes queued by one Bulk Create Media Uploads call. Useful for troubleshooting, since one save can produce more than one batch.  | read-only: true | validation: format GUID
     - name: slotKey | type: string | description: Your own key for this photo: `logo`, `cover`, or `photo:<id>`.  Set it to something stable and meaningful to you. It's how a failure is matched back to the photo that caused it, and it's part of what makes a repeated submission a duplicate rather than a second change.  | validation: maxLength 255
     - name: sourceUrl | type: string | description: Publicly reachable URL Google fetches the image from. Additions only.  Keep it reachable well beyond the upload itself. A failure report renders this URL as a thumbnail, possibly weeks later.  | validation: maxLength 2048
     - name: category | type: MediaCategory | description: Where the photo appears on the profile. Additions only.  
         - enum:
         -     COVER: The banner image at the top of the profile. One per location.
         -     PROFILE: The profile image shown alongside the business name.
         -     LOGO: The business's logo. One per location.
         -     EXTERIOR: The outside of the premises, including the storefront.
         -     INTERIOR: The inside of the premises.
         -     PRODUCT: A product the business sells.
         -     AT_WORK: The team at work, such as staff serving customers.
         -     FOOD_AND_DRINK: Food or drink the business serves.
         -     MENU: The menu, for a business that serves food or drink.
         -     COMMON_AREA: A shared space, such as a lobby or a waiting area.
         -     ROOMS: Guest rooms, for accommodation businesses.
         -     TEAMS: The people who work at the business.
         -     ADDITIONAL: Anything that doesn't fit the other categories. This is the default for a gallery photo.
     - name: format | type: MediaFormat | description: Media type of the photo. Additions only.  
         - enum: PHOTO, VIDEO
     - name: operation | type: MediaUploadOperation | description: Whether this change adds a photo to the profile or removes one.  
         - enum:
         -     CREATE: Add a photo to the profile.
         -     DELETE: Remove a photo from the profile.
     - name: sequence | type: integer | description: Position in the order the queue applies changes, assigned by the server.  Every removal comes before every addition, because Google rejects new photos on a profile that's already at its limit, so the old ones have to go first. Additions then follow as logo, cover, and gallery in the order given.  | read-only: true 
     - name: state | type: MediaUploadState | description: Whether this change is waiting, being applied, or has failed.  | read-only: true 
         - enum:
         -     PENDING: Waiting its turn in the queue.
         -     UPLOADING: Being applied to Google now. A change that stays here isn't one that never ran: its outcome isn't known yet.
         -     FAILED: Failed, and won't be retried. Kept until replaced or dismissed.
     - name: attempts | type: integer | description: How many times this change has been attempted.  | read-only: true 
     - name: mediaKey | type: string | description: Google's identifier for the photo to remove. Removals only.  | validation: maxLength 255
     - name: failure | type: MediaUploadFailure | description: Why this change failed. Present only when `state` is `FAILED`.  | read-only: true 
        - name: reason | type: MediaUploadFailureReason | description: Why the change failed, in terms you can show a site owner.  
             - enum:
             -     IMAGE_TOO_SMALL: Below Google's minimum dimensions.
             -     ASPECT_RATIO_REJECTED: Cover/logo ratio outside Google's accepted range.
             -     FORMAT_UNSUPPORTED: File type Google will not accept.
             -     SOURCE_UNREACHABLE: Google could not fetch the image URL.
             -     PERMISSION_REVOKED: Access to the Google account was lost. The site owner needs to connect again.
             -     RATE_LIMIT_EXHAUSTED: Google was still rate limiting after the queue used up its retries.
             -     UPLOAD_UNVERIFIED: The change may or may not have reached Google, and the queue chose not to risk a duplicate by trying again. Additions only.  Unlike every other reason here, this doesn't say anything is wrong with the photo. It says the outcome couldn't be confirmed. Word it for the site owner that way: "we couldn't confirm this photo was added", not "this photo was rejected".
     - name: _createdDate | type: Date | description: Date and time the change was queued.  | read-only: true 
     - name: _updatedDate | type: Date | description: Date and time the change was last updated.  | read-only: true 
     - name: revision | type: string | description: Revision number, incremented on every update.  | read-only: true 

 Possible Errors:
   HTTP Code: 428 | Status Code: FAILED_PRECONDITION | Application Code: MEDIA_UPLOAD_LIST_TOO_LARGE | Description: none


```

### Examples

### Poll a location's queue mid-drain
PENDING or UPLOADING items mean the queue is still working, so don't report results yet.

```javascript
import { mediaUploads } from "@wix/gbp";

async function listMediaUploads() {
  const response = await mediaUploads.listMediaUploads(
    "locations/8117348495523092385",
  );
}

/* Promise resolves to:
 * {
 *   "mediaUploads": [
 *     {
 *       "_id": "c41d9f7e-5a02-4be6-9d18-7f2b1c0e34aa",
 *       "locationId": "locations/8117348495523092385",
 *       "batchId": "e0b2745c-9f31-4a8d-b6c7-1d4e58a9f302",
 *       "slotKey": "logo",
 *       "sourceUrl": "https://static.wixstatic.com/media/bakery-logo.png",
 *       "category": "LOGO",
 *       "format": "PHOTO",
 *       "operation": "CREATE",
 *       "sequence": 1000,
 *       "state": "UPLOADING",
 *       "attempts": 1,
 *       "_createdDate": "2026-08-24T09:15:22.481Z",
 *       "_updatedDate": "2026-08-24T09:16:04.117Z",
 *       "revision": "2"
 *     },
 *     {
 *       "_id": "7b6a2e10-84cf-4d95-a0e3-52c9b7d16f48",
 *       "locationId": "locations/8117348495523092385",
 *       "batchId": "e0b2745c-9f31-4a8d-b6c7-1d4e58a9f302",
 *       "slotKey": "cover",
 *       "sourceUrl": "https://static.wixstatic.com/media/bakery-storefront.jpg",
 *       "category": "COVER",
 *       "format": "PHOTO",
 *       "operation": "CREATE",
 *       "sequence": 1001,
 *       "state": "FAILED",
 *       "attempts": 3,
 *       "failure": {
 *         "reason": "ASPECT_RATIO_REJECTED"
 *       },
 *       "_createdDate": "2026-08-24T09:15:22.481Z",
 *       "_updatedDate": "2026-08-24T09:18:41.905Z",
 *       "revision": "4"
 *     }
 *   ]
 * }
 */

```

### listMediaUploads (self-hosted)
Self-hosted SDK calls require you to [create a client](https://dev.wix.com/docs/sdk/articles/work-with-the-sdk/about-the-wix-client.md).

```javascript
import { createClient } from '@wix/sdk';
import { mediaUploads } from '@wix/gbp';
// Import the auth strategy for the relevant access type
// Import the relevant host module if needed

const myWixClient = createClient ({
  modules: { mediaUploads },
  // Include the auth strategy and host as relevant
});


async function listMediaUploads(locationId) {
  const response = await myWixClient.mediaUploads.listMediaUploads(locationId);
};
```

---