Foto

Aggiungi logo, copertina e foto della galleria a una sede, segna con una stella l’immagine principale ed elimina file obsoleti con l’SDK listingsapi-js.

Le foto vengono associate a una sede tramite un URL pubblico: tu ospiti l'immagine, la piattaforma la recupera e la memorizza, e le piattaforme di pubblicazione la prelevano da lì. Una sede conserva un logo, una copertina e un numero qualsiasi di foto aggiuntive, di cui al massimo 4 possono essere contrassegnate con una stella. Tutti i metodi per le foto sono disponibili sull'istanza del client ListingsAPI e operano nell'ambito di un ID sede. Gli ID numerici delle sedi vengono codificati automaticamente, quindi 1800289 e 'TG9jYXRpb246MTgwMDI4OQ==' sono intercambiabili.

I caricamenti possono riuscire in due modi. Un piccolo gruppo di immagini viene memorizzato immediatamente e la risposta contiene i file multimediali elaborati; un gruppo grande viene invece messo in coda e ricevi un ID richiesta da usare per verificare periodicamente lo stato. Scegli il percorso da seguire in base alla presenza di request.requestId, anziché contare le immagini.

fetchLocationPhotos

Elenca tutti i file multimediali associati a una sede: logo, copertina e immagini aggiuntive. Chiamalo prima di un caricamento per vedere cosa manca e raccogliere gli ID delle foto accettati dai metodi per contrassegnare con una stella e rimuovere le foto.

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

Parametri

ParametroTipoDescrizione
locationIdstring | numberSede di cui leggere le foto.

Restituisce l'array mediaFilesOfLocation, con un array vuoto come valore predefinito. Ogni file contiene id, url, thumbnailUrl, categoryName (Logo, Cover o Additional), categoryId, fileType, starred e viewsCount. Una sede senza file multimediali restituisce un array vuoto, che è la risposta normale per una sede appena creata e non un errore.

addLocationPhotos

Associa una o più immagini a una sede. Ogni elemento richiede un URL JPEG o PNG accessibile pubblicamente in photo e la posizione che occupa in 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);}}

Opzioni delle foto

ParametroTipoDescrizione
photostringURL pubblico di un file JPEG o PNG che la piattaforma recupera e memorizza. Il campo è photo, non url. Obbligatorio.
type'LOGO' | 'COVER' | 'ADDITIONAL'Posizione occupata dall'immagine. Obbligatorio.
partnerMediaIdstringIl tuo identificatore del file, conservato insieme al file per le integrazioni con i partner.

Parametri

ParametroTipoDescrizione
locationIdstring | numberSede a cui associare i file multimediali.
photosPhotoInput[]Immagini da associare. Non deve essere vuoto.

Restituisce il payload addLocationPhotos: success, photos, request, errors e clientMutationId. In un caricamento elaborato immediatamente, photos contiene i nuovi file multimediali, ciascuno con id, databaseId, url, thumbnailUrl, type e starred, mentre request è un oggetto vuoto. In un caricamento messo in coda, photos è vuoto e request.requestId è impostato. Entrambi i casi indicano un esito positivo.

Le immagini devono essere in formato JPEG o PNG e le regole sulle dimensioni delle piattaforme di pubblicazione si applicano a ciascuna posizione. Una sede conserva un solo logo e una sola copertina, quindi caricare di nuovo uno dei due sostituisce l'immagine esistente. Imposta type con attenzione: ADDITIONAL è la destinazione delle immagini della galleria.

fetchPhotoUploadStatus

Verifica periodicamente lo stato di un caricamento in coda finché non raggiunge uno stato definitivo. Usa il valore request.requestId restituito da 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);}}

Parametri

ParametroTipoDescrizione
requestIdstringL'ID richiesta di una chiamata a addLocationPhotos messa in coda.

Il payload contiene requestId, un valore status del processo pari a PROCESSING, SUCCESS o ERROR e un array photos i cui elementi contengono ciascuno mediaId, locationId, un proprio valore status e un valore errorMessage.

Il valore status del processo indica che l'elaborazione è terminata, non che tutte le immagini siano state caricate. Un processo SUCCESS può comunque contenere foto rifiutate, quindi, quando esce dallo stato PROCESSING, scorri photos e leggi ogni elemento. Attendi qualche secondo tra una verifica e l'altra: un ciclo senza pause porta rapidamente a raggiungere il limite di frequenza delle richieste. Verifica solo gli ID di un caricamento recente, perché un ID scaduto non raggiunge mai uno stato definitivo.

starLocationPhotos

Contrassegna le foto aggiuntive con una stella affinché abbiano una posizione prioritaria sulle piattaforme di pubblicazione che supportano le immagini in evidenza, oppure rimuovi la stella passando 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);

Parametri

ParametroTipoDescrizione
locationIdstring | numberSede a cui appartengono le foto.
mediaIdsstring[]ID delle foto a cui aggiungere o rimuovere la stella, ottenuti da fetchLocationPhotos o dalla risposta a un caricamento. Trasmessi come photoIds.
starredbooleantrue per contrassegnare le foto indicate con una stella, false per rimuovere la stella.

Restituisce il payload starUnstarLocationPhotos: success, photos e un singolo oggetto error anziché un array errors. Ogni foto restituita contiene id, databaseId, url, thumbnailUrl, type e il nuovo valore di starred.

Solo le foto ADDITIONAL possono essere contrassegnate con una stella; il logo e la copertina sono già immagini principali. Una sede può avere al massimo 4 foto contrassegnate con una stella e il controllo conta quelle già contrassegnate più quelle incluse nella chiamata, quindi il superamento del limite di 4 fa fallire l'intera richiesta.

removeLocationPhotos

Rimuove l'associazione delle foto a una sede tramite i loro ID. Usalo per rimuovere immagini obsolete dalla galleria o annullare un'importazione errata.

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

Parametri

ParametroTipoDescrizione
locationIdstring | numberSede a cui appartengono le foto.
photoIdsstring[]ID delle foto di cui rimuovere l'associazione, ottenuti da fetchLocationPhotos o dalla risposta a un caricamento.

Restituisce il payload removeLocationPhotos: removedCount, errors e clientMutationId. Un valore removedCount pari a 0 con errors pari a null indica che nessuno degli ID inviati era associato a quella sede, permettendoti di individuare gli ID già rimossi.

Con questo metodo puoi rimuovere solo le foto ADDITIONAL. Per sostituire un logo o una copertina, caricane invece uno nuovo. La rimozione di un file multimediale ne elimina l'associazione alla sede; non elimina necessariamente il file dalla raccolta multimediale dell'account.

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');}