En esta guía, se explica el proceso de migración de Content API for Shopping a Merchant API para la administración de datos de la empresa.
Puedes usar esta guía para migrar tu implementación existente de Content API for Shopping a Merchant API. Para obtener más información sobre los detalles de la API de Merchant y sus APIs secundarias, consulta Diseño de la API de Merchant.
Comenzar
Para comenzar a usar la API de Merchant, cambia las URLs de tus solicitudes al siguiente formato:
https://merchantapi.googleapis.com/{SUB_API}/{VERSION}/{RESOURCE_NAME}:{METHOD}…
Para usar la API de Merchant, debes vincular tu cuenta de Merchant Center y tu proyecto de Google Cloud con el método de registro de desarrollador, de la siguiente manera:
POST https://merchantapi.googleapis.com/accounts/v1/accounts/{ACCOUNT_ID}/developerRegistration:registerGcp
{
developer_email:"example-email@example.com"
}
Para obtener más información, consulta la guía de inicio rápido y la referencia de la API de Merchant.
Mejoras en comparación con Content API for Shopping
La Merchant API te permite automatizar y optimizar los flujos de trabajo en Merchant Center, y ofrece capacidades mejoradas en comparación con Content API for Shopping.
Casos de uso clave:
- Administración automatizada de cuentas
- Administración de productos automatizada
- Administración automatizada del inventario
- Informes personalizados
Áreas clave de mejora:
- Sub-APIs con nuevas funciones, incluidas las siguientes:
- El seguimiento de pedidos admite el historial de seguimiento de pedidos de la empresa para proporcionar estimaciones de envío precisas a los clientes. Sus indicadores también habilitan fichas mejoradas con envío rápido y gratuito.
- La resolución de problemas proporciona acceso a contenido de diagnóstico y acciones de asistencia de la misma manera que está disponible en la IU de Merchant Center.
- Product Studio (ALPHA) aprovecha la IA generativa para generar y optimizar los títulos y las descripciones de los productos. Debes firmar este formulario para solicitar acceso.
- Nuevos recursos en la sub-API de Accounts.
OmnichannelSettings
administra la configuración de la cuenta para la publicación en múltiples canales, como las fichas locales gratuitas (FLL) y los anuncios del inventario local (LIA).LfpProviders
se conecta con los socios del Programa de socios de feeds locales (LFP) para obtener datos de inventario.GbpAccounts
se conecta a la cuenta del Perfil de Negocio de Google para obtener datos de la tienda local.OnlineReturnPolicy
te permite crear, borrar y actualizar tus políticas en línea.
- Nuevos métodos para el inventario, los datos de productos y otras APIs, incluidos los siguientes:
- Es un método nuevo en la sub-API de Products.
ProductsUpdate
te permite actualizar productos individuales sin necesidad de proporcionar todos los campos obligatorios paraProductInput
.
- La capacidad de crear no solo fuentes de datos principales, sino también varias fuentes de datos, como las siguientes:
- Se introduce la carga de opiniones sobre productos y opiniones sobre comercios
- Con la API de Merchant, puedes habilitar notificaciones sobre los cambios en los datos de la cuenta
¿Qué cambió?
- La cantidad máxima de
pageSize
aumentó de 250 a 1,000 filas por llamada a la API. - Se corrigió una demora que existía para la inserción de productos, las promociones, las opiniones sobre productos y las opiniones sobre comercios después de la creación de
DataSources
.
Próximamente:
- Se lanzó una definición actualizada para
clickPotentialRank
en la tablaproductView
de la sub-API de Reporting: * La clasificación de los productos segúnclickPotential
se normaliza a valores entre 1 y 1,000.- Los productos con un
clickPotentialRank
bajo siguen teniendo el mayor potencial de clics entre los productos del comercio que cumplen con las condiciones de la búsqueda. Este es un cambio no interrumpido que podría lanzarse el 1 de julio de 2025.
- Los productos con un
- El campo
AccountIdAlias
del recursoAccountRelationship
permite administrar mejor las estructuras de cuentas complejas. Por ejemplo, los mercados usan un alias definido por el usuario en lugar del ID interno del comercio, como el ID de la cuenta.
Compatibilidad con gRPC
La API de Merchant admite gRPC y REST. Puedes usar gRPC para la API de Merchant y REST para la Content API for Shopping al mismo tiempo.
Las bibliotecas cliente de la API de Merchant requieren gRPC.
Para obtener más información, consulta la descripción general de gRPC.
Compatibilidad
En esta guía, se describen los cambios generales que se aplican a toda la API de Merchant.
La API de Merchant está diseñada para funcionar junto con las funciones existentes de Content API for Shopping.
Por ejemplo, puedes usar la API de Merchant Inventories junto con tu implementación existente de la API de Content v2.1 de Shopping products
. Puedes usar Content API for Shopping para subir un producto local nuevo (que vendes en una tienda local) y, luego, usar el recurso LocalInventory
de la API de Merchant Inventories para administrar la información en la tienda de ese producto.
Mejoras en Content API
La API de Merchant mejora la API de Content en las siguientes áreas:
- APIs secundarias con nuevas funciones para tu integración única
- Nuevos métodos para el inventario, los datos de productos y otras APIs
- La capacidad de crear no solo fuentes de datos principales, sino también varias fuentes de datos, como las siguientes:
- Se introduce la carga de opiniones sobre productos y opiniones sobre comercios
- Con la API de Merchant, puedes habilitar notificaciones sobre los cambios en los datos de la cuenta.
- Se introduce la capacidad de filtrado para el recurso Accounts
Analicemos estos cambios con más detalle.
Control de versiones y APIs secundarias
La API de Merchant introduce los conceptos de control de versiones y APIs secundarias. Su diseño modular mejora la facilidad de uso, ya que te permite enfocarte en las sub-APIs que necesitas y facilita las migraciones futuras a versiones más recientes. El control de versiones se aplicará con tus URLs de solicitud. La estrategia es similar a la experiencia de la API de Google Ads.
Solicitudes más robustas
Las solicitudes de URL de la API de Merchant requieren más parámetros para llamar a la API de Merchant. Esto incluye el recurso, la versión, el nombre (identificadores) y el método (métodos no estándar). Para obtener más información, consulta los identificadores de cuenta y producto y los ejemplos.
Principios de la AIP para identificadores
Si bien Content API for Shopping usa IDs para identificar recursos (por ejemplo, merchantId
, productId
), Merchant API usa un identificador name
para alinearse con la AIP (consulta los principios de mejora de la API).
El identificador {name}
incluye el identificador del recurso y su elemento superior (o potencialmente varios elementos superiores), de modo que {name}
sea igual a accounts/{account}/products/{product}
.
Todas las llamadas de lectura y escritura devuelven el campo name
como identificador del recurso.
{name}
también incluye los identificadores de colección accounts/
y products/
.
La API de Merchant usa {account}
para hacer referencia a un ID de Merchant Center y {product}
para hacer referencia a identificadores de productos.
Por ejemplo, implementa un método getName()
para recuperar el name
de un recurso y almacena el resultado como una variable en lugar de construir el name
a partir de los IDs del comercio y del recurso por tu cuenta.
A continuación, se muestra un ejemplo de cómo usar el campo name
en tus llamadas:
POST https://merchantapi.googleapis.com/inventories/v1/{PARENT}/regionalInventories:insert
En la tabla, se muestra cómo cambia la solicitud products.get
de Content API for Shopping:
Content API for Shopping | API de Merchant |
---|---|
GET https://shoppingcontent.googleapis.com/content/v2.1/{merchantId}/products/{productId}
|
GET https://merchantapi.googleapis.com/products/v1/{name}
|
Para obtener más detalles, consulta Cambios en los identificadores.
Como otro ejemplo, recuperar un producto con el identificador en~US~1234
del ID de Merchant Center 4321
con la API de Merchant se vería de la siguiente manera:
GET
https://merchantapi.googleapis.com/products/v1/accounts/4321/products/online~en~US~1234
donde {name}
es igual a accounts/4321/products/en~US~1234
. Este nuevo campo de nombre se devuelve como el identificador de recursos para todas las llamadas de lectura y escritura en la API de Merchant.
En Content API for Shopping, los dos puntos (:) denotan un delimitador en el nombre del producto, mientras que, en Merchant API, la virgulilla (~) realiza esta función. El identificador de la API de Merchant no contiene la parte channel
.
Por ejemplo, el ID del producto en Content API for Shopping:
channel:contentLanguage:feedLabel:offerId
.
en la API de Merchant se convierte en lo siguiente:
contentLanguage~feedLabel~offerId
.
Campos principales para recursos secundarios
En la API de Merchant, todos los recursos secundarios tienen el campo parent
. Puedes usar el campo parent
para especificar el {name}
del recurso en el que se insertará el secundario, en lugar de pasar todo el recurso principal. También puedes usar el campo parent
con list
.
Por ejemplo, para enumerar los inventarios locales de un producto determinado, especifica el name
del producto en el campo parent
del método list
. En este caso, el product
proporcionado es el parent
de los recursos LocalInventory que se muestran.
GET
https://merchantapi.googleapis.com/inventories/v1/{parent}/localInventories
Para recuperar todos los inventarios locales del producto en~US~1234'
y la cuenta 4321
, la solicitud se vería de la siguiente manera:
GET
https://merchantapi.googleapis.com/inventories/v1/accounts/4321/products/online~en~US~1234/localInventories</code>
El elemento superior es accounts/{account}/products/{product}
. Ten en cuenta que, en este caso, el recurso localInventories tiene dos elementos superiores incluidos en el identificador de nombre (accounts/
y products/
), ya que la cuenta es el elemento superior del recurso del producto.
Enums comunes
El uso de enumeraciones comunes proporciona más coherencia.
El campo Destination.DestinationEnum
especifica las plataformas en las que se mostrarán tus recursos.
DestinationEnum
enumera todos los valores disponibles para la segmentación por destino y se unifica en todas las APIs secundarias, por ejemplo, para los atributos de promociones.
El campo ReportingContext.ReportingContextEnum
representa el contexto al que se aplican los problemas de tu cuenta y tus productos.
Este campo se usa en todos los métodos de informes (por ejemplo, para IssueSeverityPerReportingContext
).
Compatibilidad con versiones anteriores
Cuando comiences a usar la API de Merchant, tu integración existente de Content API for Shopping seguirá funcionando sin interrupciones. Para obtener más información, consulta Compatibilidad.
Una vez que migres tus APIs secundarias a la API de Merchant, te recomendamos que solo uses la API de Merchant para tus APIs secundarias migradas.
Disponibilidad de llamadas de procedimiento remoto (gRPC)
gRPC es la nueva forma recomendada de realizar la integración con la API de Merchant.
Sus ventajas incluyen las siguientes:
- Independiente del idioma
- Se basa en búferes de protocolo
Usa HTTP/2 para proporcionar soluciones escalables de alto rendimiento (referencia de RPC).
Si usas nuestras bibliotecas cliente o muestras de código, gRPC es el mecanismo de transporte predeterminado.
Para obtener más información sobre gRPC, consulta lo siguiente:
El procesamiento por lotes personalizado se convierte en procesamiento por lotes integrado
El procesamiento por lotes funciona de manera más eficiente cuando usas llamadas asíncronas. Obtén más información sobre cómo usar llamadas paralelas para lograr el procesamiento por lotes en la API de Merchant y cómo refactorizar el código para solicitudes simultáneas.
Para acelerar la migración, te recomendamos que uses las bibliotecas cliente.
La API de Merchant no admite el método customBatch
que se incluye en Content API for Shopping. En su lugar, consulta Cómo enviar varias solicitudes a la vez o ejecuta tus llamadas de forma asíncrona.
En el siguiente ejemplo de Java, se muestra cómo insertar una entrada de producto.
import com.google.api.core.ApiFuture;
import com.google.api.core.ApiFutureCallback;
import com.google.api.core.ApiFutures;
import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.common.util.concurrent.MoreExecutors;
import com.google.shopping.merchant.products.v1.Availability;
import com.google.shopping.merchant.products.v1.Condition;
import com.google.shopping.merchant.products.v1.InsertProductInputRequest;
import com.google.shopping.merchant.products.v1.ProductAttributes;
import com.google.shopping.merchant.products.v1.ProductInput;
import com.google.shopping.merchant.products.v1.ProductInputsServiceClient;
import com.google.shopping.merchant.products.v1.ProductInputsServiceSettings;
import com.google.shopping.merchant.products.v1.Shipping;
import com.google.shopping.type.Price;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;
/** This class demonstrates how to insert a product input */
public class InsertProductInputAsyncSample {
private static String getParent(String accountId) {
return String.format("accounts/%s", accountId);
}
private static String generateRandomString() {
String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
Random random = new Random();
StringBuilder sb = new StringBuilder(8);
for (int i = 0; i < 8; i++) {
sb.append(characters.charAt(random.nextInt(characters.length())));
}
return sb.toString();
}
private static ProductInput createRandomProduct() {
Price price = Price.newBuilder().setAmountMicros(33_450_000).setCurrencyCode("USD").build();
Shipping shipping =
Shipping.newBuilder().setPrice(price).setCountry("GB").setService("1st class post").build();
Shipping shipping2 =
Shipping.newBuilder().setPrice(price).setCountry("FR").setService("1st class post").build();
ProductAttributes attributes =
ProductAttributes.newBuilder()
.setTitle("A Tale of Two Cities")
.setDescription("A classic novel about the French Revolution")
.setLink("https://exampleWebsite.com/tale-of-two-cities.html")
.setImageLink("https://exampleWebsite.com/tale-of-two-cities.jpg")
.setAvailability(Availability.IN_STOCK)
.setCondition(Condition.NEW)
.setGoogleProductCategory("Media > Books")
.addGtins("9780007350896")
.addShipping(shipping)
.addShipping(shipping2)
.build();
return ProductInput.newBuilder()
.setContentLanguage("en")
.setFeedLabel("CH")
.setOfferId(generateRandomString())
.setProductAttributes(attributes)
.build();
}
public static void asyncInsertProductInput(Config config, String dataSource) throws Exception {
// Obtains OAuth token based on the user's configuration.
GoogleCredentials credential = new Authenticator().authenticate();
// Creates service settings using the credentials retrieved above.
ProductInputsServiceSettings productInputsServiceSettings =
ProductInputsServiceSettings.newBuilder()
.setCredentialsProvider(FixedCredentialsProvider.create(credential))
.build();
// Creates parent to identify where to insert the product.
String parent = getParent(config.getAccountId().toString());
// Calls the API and catches and prints any network failures/errors.
try (ProductInputsServiceClient productInputsServiceClient =
ProductInputsServiceClient.create(productInputsServiceSettings)) {
// Creates five insert product input requests with random product IDs.
List<InsertProductInputRequest> requests = new ArrayList<>(5);
for (int i = 0; i < 5; i++) {
InsertProductInputRequest request =
InsertProductInputRequest.newBuilder()
.setParent(parent)
// You can only insert products into datasource types of Input "API", and of Type
// "Primary" or "Supplemental."
// This field takes the `name` field of the datasource.
.setDataSource(dataSource)
// If this product is already owned by another datasource, when re-inserting, the
// new datasource will take ownership of the product.
.setProductInput(createRandomProduct())
.build();
requests.add(request);
}
System.out.println("Sending insert product input requests");
List<ApiFuture<ProductInput>> futures =
requests.stream()
.map(
request ->
productInputsServiceClient.insertProductInputCallable().futureCall(request))
.collect(Collectors.toList());
// Creates callback to handle the responses when all are ready.
ApiFuture<List<ProductInput>> responses = ApiFutures.allAsList(futures);
ApiFutures.addCallback(
responses,
new ApiFutureCallback<List<ProductInput>>() {
@Override
public void onSuccess(List<ProductInput> results) {
System.out.println("Inserted products below");
System.out.println(results);
}
@Override
public void onFailure(Throwable throwable) {
System.out.println(throwable);
}
},
MoreExecutors.directExecutor());
} catch (Exception e) {
System.out.println(e);
}
}
public static void main(String[] args) throws Exception {
Config config = Config.load();
// Identifies the data source that will own the product input.
String dataSource = "accounts/" + config.getAccountId() + "/dataSources/{datasourceId}";
asyncInsertProductInput(config, dataSource);
}
}
Si usas customBatch
en Content API y necesitas esta función para la API de Merchant, indícanos el motivo en tus comentarios.
Funciones exclusivas
Las funciones futuras solo aparecerán en la API de Merchant. (Habrá algunas excepciones, como las especificaciones del feed anual de 2025).
Las funciones exclusivas de la API de Merchant incluyen las siguientes:
- API de Reviews Usa la función Opiniones para implementar y administrar las calificaciones de tus productos y tu tienda. Para obtener más información, consulta Revisión del vendedor y Revisión del producto.
- Notificaciones: Regístrate para recibir notificaciones push sobre los cambios en los datos de productos de una cuenta.
Precio
Estos son los cambios que se realizaron en Price
en el paquete Merchant Common:
Content API for Shopping | API de Merchant | |
---|---|---|
Campo de importe | value:string |
amountMicros:int64 |
Campo de moneda | currency:string
|
currencyCode:string |
El importe de Price
ahora se registra en micros, en el que 1 millón de micros equivale a la unidad estándar de tu moneda.
En Content API for Shopping, Price
era un número decimal en forma de cadena.
El nombre del campo de cantidad cambió de value
a amountMicros
El nombre del campo de moneda cambió de currency
a currencyCode
. El formato sigue siendo ISO 4217.
Actualizaciones y anuncios más recientes
Para obtener actualizaciones más detalladas, consulta las notas de la versión específicas de cada sub-API. Para obtener actualizaciones agregadas más periódicas de la API de Merchant, consulta nuestras actualizaciones más recientes.
Para obtener detalles más específicos y aprender aún más sobre la API de Merchant, consulta nuestra descripción general del sitio para desarrolladores y la guía general de migración para obtener más detalles.
Consulta Diseño de la API de Merchant para obtener detalles sobre la API de Merchant y sus APIs secundarias.