Fotos

Anexe logotipo, capa e fotos da galeria a um local, marque a imagem principal com estrela e remova arquivos desatualizados com o SDK listingsapi-js.

As fotos são anexadas a um local por meio de uma URL pública: você hospeda a imagem, a plataforma a busca e armazena, e as plataformas de publicação a obtêm a partir daí. Um local mantém um logotipo, uma capa e qualquer quantidade de fotos adicionais, das quais no máximo 4 podem ser marcadas com estrela. Todos os métodos de fotos estão na instância do cliente ListingsAPI e têm escopo restrito a um ID de local. Os IDs numéricos de local são codificados automaticamente, portanto 1800289 e 'TG9jYXRpb246MTgwMDI4OQ==' são intercambiáveis.

Os envios têm 2 formas de sucesso. Um lote pequeno é armazenado na própria chamada, que retorna a mídia já processada; um lote grande é colocado na fila, e você recebe um ID de solicitação para consultar periodicamente. Escolha o fluxo com base na presença de request.requestId, em vez de contar suas próprias imagens.

fetchLocationPhotos

Liste todos os arquivos de mídia anexados a um local: logotipo, capa e imagens adicionais. Chame este método antes de um envio para verificar o que falta e coletar os IDs de fotos aceitos pelos métodos de marcação com estrela e remoção.

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âmetroTipoDescrição
locationIdstring | numberLocal cujas fotos serão consultadas.

Retorna o array mediaFilesOfLocation, usando um array vazio como padrão. Cada arquivo contém id, url, thumbnailUrl, categoryName (Logo, Cover ou Additional), categoryId, fileType, starred e viewsCount. Um local sem mídia retorna um array vazio, que é a resposta normal para um local recém-criado, e não um erro.

addLocationPhotos

Anexe uma ou mais imagens a um local. Cada item precisa de uma URL de imagem JPEG ou PNG acessível publicamente em photo, além da posição que ocupa em 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);}}

Opções de fotos

ParâmetroTipoDescrição
photostringURL pública de uma imagem JPEG ou PNG que a plataforma busca e armazena. O campo é photo, não url. Obrigatório.
type'LOGO' | 'COVER' | 'ADDITIONAL'Posição que a imagem ocupa. Obrigatório.
partnerMediaIdstringSeu próprio identificador para o arquivo, armazenado junto com ele para integrações com parceiros.

Parâmetros

ParâmetroTipoDescrição
locationIdstring | numberLocal ao qual a mídia será anexada.
photosPhotoInput[]Imagens a anexar. Não pode estar vazio.

Retorna o payload addLocationPhotos: success, photos, request, errors e clientMutationId. Em um envio processado na própria chamada, photos contém os novos itens de mídia com id, databaseId, url, thumbnailUrl, type e starred de cada um, e request é um objeto vazio. Em um envio colocado na fila, photos está vazio e request.requestId está definido. Ambos os casos indicam sucesso.

As imagens devem estar no formato JPEG ou PNG, e as regras de tamanho das plataformas de publicação se aplicam a cada posição. Um local mantém um único logotipo e uma única capa, portanto reenviar qualquer um deles substitui a imagem existente. Defina type com atenção: ADDITIONAL é a posição destinada às imagens da galeria.

fetchPhotoUploadStatus

Consulte periodicamente um envio colocado na fila até que ele chegue a um estado final. Use o request.requestId retornado por 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âmetroTipoDescrição
requestIdstringO ID da solicitação de uma chamada a addLocationPhotos colocada na fila.

O payload contém requestId, um status da tarefa com valor PROCESSING, SUCCESS ou ERROR e um array photos cujas entradas contêm, cada uma, mediaId, locationId, seu próprio status e um errorMessage.

O status da tarefa informa que o processamento terminou, não que todas as imagens foram armazenadas. Uma tarefa SUCCESS ainda pode conter fotos rejeitadas, portanto, assim que ela sair de PROCESSING, percorra photos e leia cada entrada. Aguarde alguns segundos entre as consultas: um loop sem intervalo pode fazer você atingir rapidamente o limite de requisições. Consulte apenas IDs de um envio recente, pois um ID expirado nunca chega a um estado final.

starLocationPhotos

Marque fotos adicionais com estrela para que elas tenham prioridade de exibição nas plataformas de publicação que oferecem suporte a imagens em destaque, ou remova a estrela 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);

Parâmetros

ParâmetroTipoDescrição
locationIdstring | numberLocal ao qual as fotos pertencem.
mediaIdsstring[]IDs das fotos que serão marcadas ou desmarcadas com estrela, obtidos de fetchLocationPhotos ou de uma resposta de envio. Transmitidos como photoIds.
starredbooleantrue para marcar as fotos indicadas com estrela, false para remover a estrela.

Retorna o payload starUnstarLocationPhotos: success, photos e um único objeto error, em vez de um array errors. Cada foto retornada contém id, databaseId, url, thumbnailUrl, type e seu novo valor de starred.

Somente fotos ADDITIONAL podem ser marcadas com estrela; o logotipo e a capa já são imagens principais. Um local pode ter no máximo 4 fotos marcadas com estrela, e a verificação conta as que já estão marcadas mais as incluídas na sua chamada, portanto ultrapassar 4 faz a solicitação inteira falhar.

removeLocationPhotos

Desvincule fotos de um local pelos IDs delas. Use este método para remover imagens desatualizadas da galeria ou desfazer uma importação incorreta.

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

Parâmetros

ParâmetroTipoDescrição
locationIdstring | numberLocal ao qual as fotos pertencem.
photoIdsstring[]IDs das fotos a desvincular, obtidos de fetchLocationPhotos ou de uma resposta de envio.

Retorna o payload removeLocationPhotos: removedCount, errors e clientMutationId. Um removedCount igual a 0 com errors igual a null significa que nenhum dos IDs enviados estava vinculado àquele local, o que permite identificar IDs que já haviam sido removidos.

Somente fotos ADDITIONAL podem ser removidas aqui. Para substituir um logotipo ou uma capa, envie uma nova imagem. A remoção da mídia a desvincula do local; ela não necessariamente exclui o arquivo da biblioteca de mídia da conta.

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