En esta página, se explica cómo puedes subir y administrar tus productos de forma programática. Con la API de Merchant Products, puedes insertar o actualizar un producto en una fuente de datos, recuperar un producto de tu cuenta y borrar un producto de una fuente de datos.
La API de Merchant Products contiene dos recursos.
productInputs
representa las partes de entrada de tus productos.products
representa los productos procesados que se construyeron a partir de las partes de entrada.
productInputs
puede ser principal y complementario, según si se sube a una fuente de datos principal o a una fuente de datos complementaria.
Cada product
se construirá a partir de un solo productInput
principal y cualquier cantidad de productInputs
complementarios.
Puedes usar la API de Merchant Products para crear catálogos de tiendas en línea o locales, que son productos que pueden aparecer en varios destinos de compras.
Puedes usar el recurso productInputs
una vez que hayas creado tu cuenta de Merchant Center, configurado tu primera fuente de datos y tengas todo listo para subir un conjunto inicial de productos a través de la API.
Si bien los comercios pueden subir productos con un archivo llamado PrimaryProductDataSource, existen varias ventajas de crear y borrar productos con la API de Merchant Center. Estas ventajas incluyen un tiempo de respuesta más rápido y la capacidad de actualizar productos en tiempo real, sin necesidad de administrar archivos grandes. Los cambios en los productos realizados a través de llamadas a la API pueden tardar hasta varias horas en aparecer en la base de datos de Shopping.
Requisitos previos
Si no tienes una fuente de datos, crea una con la API de Merchant Data Sources o Merchant Center.
Si ya tienes una fuente de datos que creaste con la IU de Merchant Center o con la API, puedes usar la API de Merchant Products para agregar tus productos. Si usas Content API for Shopping para agregar productos, consulta la guía de migración para obtener información sobre cómo comenzar a usar la API de Merchant Products.
Usted es responsable de cumplir con las políticas de anuncios de Shopping y de fichas gratuitas. Anuncios de Shopping se reserva el derecho de aplicar estas políticas y responder según corresponda si detectamos contenido o comportamientos que las infrinjan.
Recursos
El recurso products
te permite recuperar información de productos de la base de datos de Shopping.
El recurso productInput
representa los datos de entrada que envías para un producto. También proporciona métodos que te permiten actualizar o borrar la información de los productos de a uno o de muchos a la vez en el modo por lotes. Un recurso productInput
debe tener los siguientes campos:
channel
: Es el canal del producto.offerId
: Es el identificador único del producto.contentLanguage
: Es el código de idioma ISO 639-1 de dos letras del producto.feedLabel
: Es la etiqueta que te permite categorizar e identificar tus productos. La cantidad máxima de caracteres permitidos es de 20, y los caracteres admitidos sonA-Z
,0-9
, guion y guion bajo. La etiqueta del feed no debe incluir espacios. Para obtener más información, consulta Cómo usar etiquetas de feed.
Sube una entrada de producto a tu cuenta
Para subir una entrada de producto a tu cuenta, usa el método accounts.productInputs.insert
. Debes pasar el identificador único de la fuente de datos principal o complementaria.
En la siguiente solicitud de ejemplo, se muestra cómo puedes usar el método accounts.productInputs.insert
para subir una entrada de producto a tu cuenta de comerciante. La solicitud establece el precio y la región de envío, y los atributos personalizados, como la fecha de fabricación y el tamaño.
POST https://merchantapi.googleapis.com/products/v1beta/accounts/{ACCOUNT_ID}/productInputs:insert?dataSource={DATASOURCE}
{
"name": "{PRODUCT_TITLE}",
"versionNumber": {VERSION_NUMBER},
"contentLanguage": "{CONTENT_LANGUAGE}",
"feedLabel": "{FEED_LABEL}",
"offerId": "{OFFER_ID}",
"channel": "ONLINE",
"attributes": {
"availability": "in stock",
"imageLink": "{IMAGE_LINK}",
"link": "{PRODUCT_LINK}",
"brand": "{BRAND_NAME}",
"price": {
"currencyCode": "{CURRENCY_CODE}",
"amountMicros": {PRICE}
},
"color": "red",
"productWeight": {
"value": 320,
"unit": "g"
},
"adult": false,
"shipping": [
{
"country": "GB",
"price": {
"amountMicros": {SHIPPING_COST},
"currencyCode": "{CURRENCY_CODE_SHIPPING}"
},
"postalCode": "{SHIPPING_POSTALCODE}",
"service": "",
"region": "{SHIPPING_REGION}",
"maxHandlingTime": "{MAX_HANDLING_TIME}",
"minHandlingTime": "{MIN_HANDLING_TIME}",
"maxTransitTime": "{MAX_TRANSIT_TIME}",
"minTransitTime": "{MIN_TRANSIT_TIME}"
}
],
"gender": "Female"
},
"customAttributes": [
{
"name": "size",
"value": "Large"
},
{
"name": "Date of Manufacturing",
"value": "2024-05-05"
}
]
}
Reemplaza lo siguiente:
- {ACCOUNT_ID}: Es el identificador único de tu cuenta de Merchant Center.
- {DATASOURCE}: Es el identificador único de la fuente de datos. Debe tener el formato
accounts/
{ACCOUNT_ID}/dataSources/
{DATASOURCE_ID}. - {PRODUCT_TITLE}: Es el nombre del producto.
- {VERSION_NUMBER}: Es el número de versión del producto. Opcional.
- {CONTENT_LANGUAGE}: Es el código de idioma ISO 639-1 de dos letras del producto. Obligatorio.
- {FEED_LABEL}: Es la etiqueta que te permite categorizar y identificar tus productos. La cantidad máxima de caracteres permitidos es de 20, y los caracteres admitidos son
A-Z
,0-9
, guion y guion bajo. La etiqueta del feed no debe incluir espacios. - {OFFER_ID}: Es el identificador único del producto. Obligatorio.
- {IMAGE_LINK}: Es el vínculo a la imagen del producto en tu sitio web. Opcional.
- {PRODUCT_LINK}: Es el vínculo al producto en tu sitio web. Opcional.
- {CURRENCY_CODE}: Es la moneda del precio con acrónimos de tres letras según la ISO 4217. Opcional.
- {PRICE}: Es el precio del producto representado como un número en micros. Opcional.
- {SHIPPING_COST}: Es el precio de envío fijo representado como un número. Opcional.
- {SHIPPING_POSTALCODE}: Es el intervalo de códigos postales en el que se aplica la tarifa de envío. Opcional.
- {MAX_HANDLING_TIME}: Es el tiempo de preparación máximo en días hábiles entre el momento en que se recibe el pedido y el momento en que se envía. Opcional.
- {MIN_HANDLING_TIME}: Es el tiempo de preparación mínimo en días hábiles entre el momento en que se recibe el pedido y el momento en que se envía. El valor 0 significa que el pedido se entrega el mismo día en que se recibe. Opcional.
- {MAX_TRANSIT_TIME}: Es el tiempo máximo en tránsito en días hábiles entre el momento en que se envía el pedido y el momento en que se entrega. Opcional.
- {MIN_TRANSIT_TIME}: Es el tiempo mínimo en tránsito en días hábiles entre el momento en que se envía el pedido y el momento en que se entrega. El valor 0 significa que el pedido se entrega el mismo día en que se envía. Opcional.
Cuando la solicitud se ejecuta correctamente, verás la siguiente respuesta:
{
"name": "{PRODUCT_NAME}",
"product": "{PRODUCT_ID}",
"channel": "ONLINE",
"offerId": "{OFFER_ID}",
"contentLanguage": "{CONTENT_LANGUAGE}",
"feedLabel": "{FEED_LABEL}",
"versionNumber": "{VERSION_NUMBER}",
"attributes": {
"link": "{PRODUCT_LINK}",
"imageLink": "{IMAGE_LINK}",
"adult": false,
"availability": "in stock",
"brand": "{BRAND_NAME}",
"color": "red",
"gender": "Female",
"price": {
"amountMicros": "{PRICE}",
"currencyCode": "{CURRENCY_CODE}"
},
"shipping": [
{
"price": {
"amountMicros": "{SHIPPING_COST}",
"currencyCode": "{CURRENCY_CODE}"
},
"country": "{SHIPPING_COUNTRY}",
"region": "{SHIPPING_REGION}",
"postalCode": "{SHIPPING_POSTALCODE}",
"minHandlingTime": "{MIN_HANDLING_TIME}",
"maxHandlingTime": "{MAX_HANDLING_TIME}",
"minTransitTime": "{MIN_TRANSIT_TIME}",
"maxTransitTime": "{MAX_TRANSIT_TIME}"
}
],
"productWeight": {
"value": 320,
"unit": "g"
}
},
"customAttributes": [
{
"name": "Size",
"value": "Large"
},
{
"name": "Date of Manufacturing",
"value": "2024-05-05"
}
]
}
Para agregar un producto a tu cuenta de Merchant Center, puedes usar el método google.shopping.merchant.accounts.v1beta.InsertProductInputSample
, como se muestra en el siguiente ejemplo.
Java
public static void insertProductInput(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)) {
// Price to be used for shipping ($33.45).
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();
Attributes attributes =
Attributes.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("in stock")
.setCondition("new")
.setGoogleProductCategory("Media > Books")
.setGtin(0, "9780007350896")
.addShipping(shipping)
.addShipping(shipping2)
.build();
// The datasource can be either a primary or supplemental datasource.
InsertProductInputRequest request =
InsertProductInputRequest.newBuilder()
.setParent(parent)
// You can only insert products into datasource types of Input "API" and "FILE", 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(
ProductInput.newBuilder()
.setChannel(ChannelEnum.ONLINE)
.setContentLanguage("en")
.setFeedLabel("label")
.setOfferId("sku123")
.setAttributes(attributes)
.build())
.build();
System.out.println("Sending insert ProductInput request");
ProductInput response = productInputsServiceClient.insertProductInput(request);
System.out.println("Inserted ProductInput Name below");
// The last part of the product name will be the product ID assigned to a product by Google.
// Product ID has the format `channel~contentLanguage~feedLabel~offerId`
System.out.println(response.getName());
System.out.println("Inserted Product Name below");
System.out.println(response.getProduct());
} catch (Exception e) {
System.out.println(e);
}
}
Cómo recuperar un producto procesado de tu cuenta
Para recuperar un producto procesado de tu cuenta, usa el método accounts.products.get
. El producto procesado puede tardar varios minutos en aparecer después de la inserción.
GET https://merchantapi.googleapis.com/products/v1beta/accounts/{ACCOUNT_ID}/products/{PRODUCT_NAME}
Reemplaza {PRODUCT_NAME} por el nombre del recurso de entrada del producto que deseas borrar. Por ejemplo, online~en~US~sku123
Puedes obtener el nombre del recurso del producto procesado del campo product
en la respuesta de accounts.productInputs.insert
.
Para recuperar un solo producto de una cuenta de Merchant Center determinada, puedes usar el método google.shopping.merchant.accounts.v1beta.GetProductRequest
, como se muestra en el siguiente ejemplo.
Java
public static void getProduct(Config config, String product) throws Exception {
// Obtains OAuth token based on the user's configuration.
GoogleCredentials credential = new Authenticator().authenticate();
// Creates service settings using the credentials retrieved above.
ProductsServiceSettings productsServiceSettings =
ProductsServiceSettings.newBuilder()
.setCredentialsProvider(FixedCredentialsProvider.create(credential))
.build();
// Calls the API and catches and prints any network failures/errors.
try (ProductsServiceClient productsServiceClient =
ProductsServiceClient.create(productsServiceSettings)) {
// The name has the format: accounts/{account}/products/{productId}
GetProductRequest request = GetProductRequest.newBuilder().setName(product).build();
System.out.println("Sending get product request:");
Product response = productsServiceClient.getProduct(request);
System.out.println("Retrieved Product below");
System.out.println(response);
} catch (Exception e) {
System.out.println(e);
}
}
Cómo borrar una entrada de producto de tu cuenta
Para borrar una entrada de producto de tu cuenta, usa el método accounts.productInputs.delete
. Para borrar un producto con la API de Merchant Products, debes pasar el identificador único de la fuente de datos principal o complementaria a la que pertenece el producto.
En la siguiente solicitud, se muestra cómo puedes usar el método accounts.productInputs.delete
para borrar una entrada de producto:
DELETE https://merchantapi.googleapis.com/products/v1beta/accounts/{ACCOUNT_ID}/productInputs/{PRODUCT_NAME}?dataSource=accounts/{ACCOUNT_ID}/dataSources/{DATASOURCE_ID}
Reemplaza {PRODUCT_NAME} por el nombre del recurso de entrada del producto que deseas borrar. Por ejemplo, online~en~US~sku123
Para borrar un producto de una cuenta de Merchant Center determinada, puedes usar el método google.shopping.merchant.accounts.v1beta.DeleteProductInputRequest
, como se muestra en el siguiente ejemplo.
Java
public static void deleteProductInput(Config config, String productId, 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 product name to identify product.
String name =
ProductInputName.newBuilder()
.setAccount(config.getAccountId().toString())
.setProductinput(productId)
.build()
.toString();
// Calls the API and catches and prints any network failures/errors.
try (ProductInputsServiceClient productInputsServiceClient =
ProductInputsServiceClient.create(productInputsServiceSettings)) {
DeleteProductInputRequest request =
DeleteProductInputRequest.newBuilder().setName(name).setDataSource(dataSource).build();
System.out.println("Sending deleteProductInput request");
productInputsServiceClient.deleteProductInput(request); // no response returned on success
System.out.println(
"Delete successful, note that it may take a few minutes for the delete to update in"
+ " the system. If you make a products.get or products.list request before a few"
+ " minutes have passed, the old product data may be returned.");
} catch (Exception e) {
System.out.println(e);
}
}
Cómo mostrar productos de tu cuenta
Para enumerar los productos procesados en tu cuenta, usa el método accounts.products.list
, como se muestra en la siguiente solicitud.
GET https://merchantapi.googleapis.com/products/v1beta/accounts/{ACCOUNT_ID}/products
Para publicar un producto en una cuenta de Merchant Center determinada, puedes usar el método google.shopping.merchant.accounts.v1beta.ListProductsRequest
, como se muestra en el siguiente ejemplo.
Java
public static void listProducts(Config config) throws Exception {
// Obtains OAuth token based on the user's configuration.
GoogleCredentials credential = new Authenticator().authenticate();
// Creates service settings using the credentials retrieved above.
ProductsServiceSettings productsServiceSettings =
ProductsServiceSettings.newBuilder()
.setCredentialsProvider(FixedCredentialsProvider.create(credential))
.build();
// Creates parent to identify the account from which to list all products.
String parent = getParent(config.getAccountId().toString());
// Calls the API and catches and prints any network failures/errors.
try (ProductsServiceClient productsServiceClient =
ProductsServiceClient.create(productsServiceSettings)) {
// The parent has the format: accounts/{account}
ListProductsRequest request = ListProductsRequest.newBuilder().setParent(parent).build();
System.out.println("Sending list products request:");
ListProductsPagedResponse response = productsServiceClient.listProducts(request);
int count = 0;
// Iterates over all rows in all pages and prints the datasource in each row.
// Automatically uses the `nextPageToken` if returned to fetch all pages of data.
for (Product product : response.iterateAll()) {
System.out.println(product); // The product includes the `productStatus` field
// That shows approval and disapproval information.
count++;
}
System.out.print("The following count of products were returned: ");
System.out.println(count);
} catch (Exception e) {
System.out.println("An error has occured: ");
System.out.println(e);
}
}