Fotos

Añade logo, portada y fotos de galería a una ubicación, marca con estrella la imagen principal y elimina archivos obsoletos con el SDK listingsapi-js.

Las fotos se adjuntan a una ubicación mediante una URL pública: tú alojas la imagen, la plataforma la descarga y la almacena, y las plataformas de publicación la obtienen desde allí. Una ubicación conserva un logotipo, una portada y cualquier número de fotos adicionales, de las cuales se pueden marcar como destacadas un máximo de cuatro. Todos los métodos de fotos están disponibles en la instancia del cliente ListingsAPI y se limitan a un ID de ubicación. Los ID numéricos de ubicación se codifican automáticamente, por lo que 1800289 y 'TG9jYXRpb246MTgwMDI4OQ==' son intercambiables.

Las cargas pueden completarse correctamente de dos formas. Un lote pequeño se almacena durante la propia solicitud y devuelve los archivos multimedia ya procesados; un lote grande se pone en cola y recibes un ID de solicitud para consultar su estado periódicamente. Elige cómo continuar en función de si request.requestId está presente, en lugar de contar tus propias imágenes.

fetchLocationPhotos

Enumera todos los archivos multimedia adjuntos a una ubicación: logotipo, portada e imágenes adicionales. Llama a este método antes de una carga para ver qué falta y recopilar los ID de foto que aceptan los métodos para marcar como destacadas y eliminar.

TypeScript
const photos = await client.fetchLocationPhotos(1800289); for (const p of photos) {console.log(p.id, p.categoryName, p.starred, p.url);}

Parámetros

ParámetroTipoDescripción
locationIdstring | numberUbicación cuyas fotos se van a consultar.

Devuelve el array mediaFilesOfLocation al resolverse, con un array vacío como valor predeterminado. Cada archivo incluye id, url, thumbnailUrl, categoryName (Logo, Cover o Additional), categoryId, fileType, starred y viewsCount. Una ubicación sin archivos multimedia devuelve un array vacío, que es la respuesta normal para una ubicación recién creada y no un error.

addLocationPhotos

Adjunta una o más imágenes a una ubicación. Cada elemento necesita una URL de una imagen JPEG o PNG accesible públicamente en photo, además de la categoría que ocupa en type.

TypeScript
const result = await client.addLocationPhotos(1800289, [{ photo: 'https://cdn.example.com/brightsmile/logo.png', type: 'LOGO' },{ photo: 'https://cdn.example.com/brightsmile/storefront.jpg', type: 'ADDITIONAL' },]); if (result.request?.requestId) {// Queued: poll fetchPhotoUploadStatus with this idconsole.log('queued', result.request.requestId);} else {for (const p of result.photos ?? []) {  console.log('stored', p.id, p.type);}}

Opciones de las fotos

ParámetroTipoDescripción
photostringURL pública de la imagen JPEG o PNG que la plataforma descarga y almacena. El campo es photo, no url. Obligatorio.
type'LOGO' | 'COVER' | 'ADDITIONAL'Categoría que ocupa la imagen. Obligatorio.
partnerMediaIdstringTu propio identificador del archivo, que se conserva junto a él para integraciones con socios.

Parámetros

ParámetroTipoDescripción
locationIdstring | numberUbicación a la que se van a adjuntar los archivos multimedia.
photosPhotoInput[]Imágenes que se van a adjuntar. No debe estar vacío.

Devuelve el contenido de addLocationPhotos al resolverse: success, photos, request, errors y clientMutationId. En una carga procesada durante la propia solicitud, photos contiene los nuevos archivos multimedia con los valores de id, databaseId, url, thumbnailUrl, type y starred de cada uno, y request es un objeto vacío. En una carga puesta en cola, photos está vacío y request.requestId tiene un valor asignado. Ambos casos indican que la solicitud se ha completado correctamente.

Las imágenes deben ser JPEG o PNG, y las reglas de tamaño de las plataformas de publicación se aplican a cada categoría. Una ubicación conserva un único logotipo y una única portada, por lo que volver a cargar cualquiera de ellos sustituye la imagen existente. Elige el valor de type de forma explícita: ADDITIONAL es la categoría que corresponde a las imágenes de la galería.

fetchPhotoUploadStatus

Consulta periódicamente el estado de una carga puesta en cola hasta que finalice. Usa el request.requestId que devolvió addLocationPhotos.

TypeScript
let job = await client.fetchPhotoUploadStatus('e6c2d9d9-9a18-4015-88cf-9a4e19a6f49a'); while (job.status === 'PROCESSING') {await new Promise((resolve) => setTimeout(resolve, 5000));job = await client.fetchPhotoUploadStatus('e6c2d9d9-9a18-4015-88cf-9a4e19a6f49a');} for (const p of job.photos ?? []) {if (p.status === 'ERROR') {  console.log('rejected:', p.errorMessage);}}

Parámetros

ParámetroTipoDescripción
requestIdstringEl ID de solicitud de una llamada a addLocationPhotos que se haya puesto en cola.

El contenido de la respuesta incluye requestId, un status del trabajo con el valor PROCESSING, SUCCESS o ERROR, y un array photos cuyas entradas contienen, cada una, mediaId, locationId, su propio status y un errorMessage.

El status del trabajo indica que el procesamiento ha terminado, no que todas las imágenes se hayan almacenado. Un trabajo SUCCESS aún puede contener fotos rechazadas, así que, una vez que salga de PROCESSING, recorre photos y lee cada entrada. Espera unos segundos entre consultas: un bucle sin pausas puede hacer que alcances rápidamente el límite de solicitudes. Consulta únicamente los ID de una carga reciente, porque uno caducado nunca llega a un estado final.

starLocationPhotos

Marca las fotos adicionales como destacadas para que tengan prioridad de aparición en las plataformas de publicación que admiten imágenes destacadas, o quítales esa marca pasando false.

TypeScript
// Feature a photoconst result = await client.starLocationPhotos(1800289,['TWVkaWFGaWxlOjU4Nzg5MzI='],true,); console.log(result.success, result.photos[0].starred); // Reverse itawait client.starLocationPhotos(1800289, ['TWVkaWFGaWxlOjU4Nzg5MzI='], false);

Parámetros

ParámetroTipoDescripción
locationIdstring | numberUbicación a la que pertenecen las fotos.
mediaIdsstring[]ID de las fotos que se van a marcar como destacadas o a las que se va a quitar esa marca, obtenidos de fetchLocationPhotos o de una respuesta de carga. Se envían a través de la red como photoIds.
starredbooleantrue para marcar las fotos indicadas como destacadas, false para quitarles esa marca.

Devuelve el contenido de starUnstarLocationPhotos al resolverse: success, photos y un único objeto error en lugar de un array errors. Cada foto devuelta incluye id, databaseId, url, thumbnailUrl, type y su nuevo valor de starred.

Solo las fotos ADDITIONAL se pueden marcar como destacadas; el logotipo y la portada ya son imágenes principales. Una ubicación puede tener como máximo cuatro fotos destacadas, y la comprobación cuenta las que ya están marcadas más las de tu llamada, por lo que superar cuatro hace que falle toda la solicitud.

removeLocationPhotos

Desvincula fotos de una ubicación mediante sus ID. Usa este método para retirar imágenes obsoletas de la galería o deshacer una importación incorrecta.

TypeScript
const result = await client.removeLocationPhotos(1800289, ['TWVkaWFGaWxlOjU4Nzg5MzI=',]); console.log(result.removedCount); // 1

Parámetros

ParámetroTipoDescripción
locationIdstring | numberUbicación a la que pertenecen las fotos.
photoIdsstring[]ID de las fotos que se van a desvincular, obtenidos de fetchLocationPhotos o de una respuesta de carga.

Devuelve el contenido de removeLocationPhotos al resolverse: removedCount, errors y clientMutationId. Un valor de cero en removedCount con errors en null significa que ninguno de los ID que enviaste estaba vinculado a esa ubicación, lo que permite detectar los ID que ya se habían desvinculado.

Aquí solo se pueden eliminar las fotos ADDITIONAL. Para sustituir un logotipo o una portada, carga uno nuevo. Eliminar un archivo multimedia lo desvincula de la ubicación; no necesariamente borra el archivo de la biblioteca multimedia de la cuenta.

refresh_photos.ts
import { ListingsAPI } from 'listingsapi-js'; const client = new ListingsAPI(); // reads LISTINGSAPI_KEY from envconst LOCATION_ID = 1800289; // Brightsmile Dental // 1. See what is already attachedconst existing = await client.fetchLocationPhotos(LOCATION_ID);const hasLogo = existing.some((p) => p.categoryName === 'Logo'); // 2. Upload only what is missing, plus the new hero shotconst uploaded = await client.addLocationPhotos(LOCATION_ID, [...(hasLogo ? [] : [{ photo: 'https://cdn.example.com/brightsmile/logo.png', type: 'LOGO' as const }]),{ photo: 'https://cdn.example.com/brightsmile/hero-2026.jpg', type: 'ADDITIONAL' as const },]); // 3. Feature the new hero shotconst hero = (uploaded.photos ?? []).find((p) => p.type === 'ADDITIONAL');if (hero) {await client.starLocationPhotos(LOCATION_ID, [hero.id], true);} // 4. Retire last season's imagesconst stale = existing.filter((p) => p.categoryName === 'Additional' && !p.starred).map((p) => p.id);if (stale.length > 0) {const removed = await client.removeLocationPhotos(LOCATION_ID, stale);console.log('removed ' + removed.removedCount + ' stale photos');}