Cette page explique comment importer et gérer vos produits de manière programmatique. L'API Merchant Products vous permet d'insérer ou de mettre à jour un produit dans une source de données, de récupérer un produit dans votre compte et de supprimer un produit d'une source de données.
L'API Merchant Products contient deux ressources.
productInputs
représente les éléments d'entrée de vos produits.products
représente les produits transformés créés à partir de vos éléments d'entrée.
productInputs
peut être principal et supplémentaire, selon qu'il est importé dans une source de données principale ou une source de données supplémentaire.
Chaque product
sera construit à partir d'un seul productInput
principal et d'un nombre quelconque de productInputs
supplémentaires.
Vous pouvez utiliser Merchant Products API pour créer des catalogues de magasins en ligne ou en magasin. Il s'agit de produits pouvant apparaître sur plusieurs sites d'achat.
Vous pouvez utiliser la ressource productInputs
une fois que vous avez créé votre compte Merchant Center, configuré votre première source de données et êtes prêt à importer un ensemble initial de produits via l'API.
Bien que les marchands puissent importer des produits à l'aide d'un fichier appelé PrimaryProductDataSource, la création et la suppression de produits à l'aide de Merchant API présente plusieurs avantages. Ces avantages incluent un temps de réponse plus rapide et la possibilité de mettre à jour les produits en temps réel, sans avoir à gérer de gros fichiers. Il peut s'écouler plusieurs heures avant que les modifications apportées aux produits via des appels d'API soient appliquées dans la base de données Shopping.
Prérequis
Si vous ne disposez pas d'une source de données, créez-en une à l'aide de l'API Merchant Data Sources ou de Merchant Center.
Si vous avez déjà créé une source de données à l'aide de l'interface utilisateur de Merchant Center ou de l'API, vous pouvez utiliser l'API Merchant Products pour ajouter vos produits. Si vous utilisez Content API for Shopping pour ajouter des produits, consultez le guide de migration pour savoir comment commencer à utiliser Merchant Products API.
Vous êtes tenu de respecter les règles concernant les annonces Shopping et les fiches gratuites. Les annonces Shopping se réservent le droit de faire appliquer ces règles et de prendre les mesures appropriées si nous détectons un contenu ou un comportement qui n'y est pas conforme.
Ressources
La ressource products
vous permet de récupérer des informations produit à partir de la base de données Shopping.
La ressource productInput
représente les données d'entrée que vous envoyez pour un produit. Elle fournit également des méthodes qui vous permettent de mettre à jour ou de supprimer des informations sur un produit, voire sur plusieurs produits en même temps, en mode par lot. Une ressource productInput
doit comporter les champs suivants:
channel
: canal du produit.offerId
: identifiant unique du produit.contentLanguage
: code de langue ISO 639-1 à deux lettres du produit.feedLabel
: libellé qui vous permet de classer et d'identifier vos produits. Le nombre maximal de caractères autorisés est de 20. Les caractères acceptés sontA-Z
,0-9
, le trait d'union et le trait de soulignement. Le libellé du flux ne doit pas comporter d'espaces. Pour en savoir plus, consultez Utiliser des libellés de flux.
Importer une entrée produit dans votre compte
Pour importer une entrée de produit dans votre compte, utilisez la méthode accounts.productInputs.insert
. Vous devez transmettre l'identifiant unique de la source de données principale ou supplémentaire.
L'exemple de requête suivant montre comment utiliser la méthode accounts.productInputs.insert
pour importer une entrée de produit dans votre compte marchand. La requête définit le prix et la région de livraison, ainsi que des attributs personnalisés tels que la date de fabrication et la taille.
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"
}
]
}
Remplacez les éléments suivants :
- {ACCOUNT_ID}: identifiant unique de votre compte Merchant Center.
- {DATASOURCE}: identifiant unique de la source de données. Il doit être au format
accounts/
{ACCOUNT_ID}/dataSources/
{DATASOURCE_ID}. - {PRODUCT_TITLE}: nom du produit.
- {VERSION_NUMBER}: numéro de version du produit. Facultatif.
- {CONTENT_LANGUAGE}: code de langue ISO 639-1 à deux lettres du produit. Obligatoire.
- {FEED_LABEL}: libellé qui vous permet de classer et d'identifier vos produits. Le nombre maximal de caractères autorisés est de 20. Les caractères acceptés sont
A-Z
,0-9
, le tiret et le trait de soulignement. Le libellé du flux ne doit pas comporter d'espaces. - {OFFER_ID}: identifiant unique du produit. Obligatoire.
- {IMAGE_LINK}: lien vers l'image du produit sur votre site Web. Facultatif.
- {PRODUCT_LINK}: lien vers le produit sur votre site Web. Facultatif.
- {CURRENCY_CODE}: devise du prix à l'aide d'acronymes à trois lettres, conformément à la norme ISO 4217. Facultatif.
- {PRICE}: prix du produit représenté sous la forme d'un nombre en micros. Facultatif.
- {SHIPPING_COST}: prix de livraison fixe, représenté sous forme de nombre. Facultatif.
- {SHIPPING_POSTALCODE}: plage de codes postaux pour laquelle le tarif de livraison s'applique. Facultatif.
- {MAX_HANDLING_TIME}: temps de traitement maximal en jours ouvrés entre la réception de la commande et son expédition. Facultatif.
- {MIN_HANDLING_TIME}: temps de traitement minimal en jours ouvrés entre la réception de la commande et son expédition. La valeur 0 signifie que la commande est livrée le jour même de sa réception. Facultatif.
- {MAX_TRANSIT_TIME}: délai d'acheminement maximal en jours ouvrés entre l'expédition de la commande et sa livraison. Facultatif.
- {MIN_TRANSIT_TIME}: délai d'acheminement minimal en jours ouvrés entre l'expédition de la commande et sa livraison. La valeur 0 signifie que la commande est livrée le même jour que son expédition. Facultatif.
Lorsque la requête aboutit, la réponse suivante s'affiche:
{
"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"
}
]
}
Pour ajouter un produit à votre compte Merchant Center, vous pouvez utiliser la méthode google.shopping.merchant.accounts.v1beta.InsertProductInputSample
, comme illustré dans l'exemple suivant.
import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.shopping.merchant.products.v1beta.Attributes;
import com.google.shopping.merchant.products.v1beta.InsertProductInputRequest;
import com.google.shopping.merchant.products.v1beta.ProductInput;
import com.google.shopping.merchant.products.v1beta.ProductInputsServiceClient;
import com.google.shopping.merchant.products.v1beta.ProductInputsServiceSettings;
import com.google.shopping.merchant.products.v1beta.Shipping;
import com.google.shopping.type.Channel.ChannelEnum;
import com.google.shopping.type.Price;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;
/** This class demonstrates how to insert a product input */
public class InsertProductInputSample {
private static String getParent(String accountId) {
return String.format("accounts/%s", accountId);
}
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);
}
}
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/{INSERT_DATASOURCE_ID}";
insertProductInput(config, dataSource);
}
}
Récupérer un produit traité dans votre compte
Pour récupérer un produit traité dans votre compte, utilisez la méthode accounts.products.get
. L'affichage du produit traité peut prendre plusieurs minutes après l'insertion.
GET https://merchantapi.googleapis.com/products/v1beta/accounts/{ACCOUNT_ID} /products/{PRODUCT_NAME}
Remplacez {PRODUCT_NAME} par le nom de la ressource d'entrée de produit que vous souhaitez supprimer. Exemple :online~en~US~sku123
Vous pouvez obtenir le nom de la ressource du produit traité à partir du champ product
dans la réponse de accounts.productInputs.insert
.
Pour récupérer un seul produit pour un compte Merchant Center donné, vous pouvez utiliser la méthode google.shopping.merchant.accounts.v1beta.GetProductRequest
, comme illustré dans l'exemple suivant.
import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.shopping.merchant.products.v1beta.GetProductRequest;
import com.google.shopping.merchant.products.v1beta.Product;
import com.google.shopping.merchant.products.v1beta.ProductsServiceClient;
import com.google.shopping.merchant.products.v1beta.ProductsServiceSettings;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;
/** This class demonstrates how to get a single product for a given Merchant Center account */
public class GetProductSample {
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);
}
}
public static void main(String[] args) throws Exception {
Config config = Config.load();
// The name of the `product`, returned after a `Product.insert` request. We recommend
// having stored this value in your database to use for all future requests.
String product = "accounts/{datasource}/products/{productId}";
getProduct(config, product);
}
}
Supprimer une entrée de produit de votre compte
Pour supprimer une entrée de produit de votre compte, utilisez la méthode accounts.productInputs.delete
. Pour supprimer un produit à l'aide de l'API Merchant Products, vous devez transmettre l'identifiant unique de la source de données principale ou supplémentaire à laquelle le produit appartient.
La requête suivante montre comment utiliser la méthode accounts.productInputs.delete
pour supprimer une entrée de produit:
DELETE https://merchantapi.googleapis.com/products/v1beta/accounts/{ACCOUNT_ID} /productInputs/{PRODUCT_NAME} ?dataSource=accounts/{ACCOUNT_ID} /dataSources/{DATASOURCE_ID}
Remplacez {PRODUCT_NAME} par le nom de la ressource d'entrée de produit que vous souhaitez supprimer. Exemple :online~en~US~sku123
Pour supprimer un produit d'un compte Merchant Center donné, vous pouvez utiliser la méthode google.shopping.merchant.accounts.v1beta.DeleteProductInputRequest
, comme illustré dans l'exemple suivant.
import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.shopping.merchant.products.v1beta.DeleteProductInputRequest;
import com.google.shopping.merchant.products.v1beta.ProductInputName;
import com.google.shopping.merchant.products.v1beta.ProductInputsServiceClient;
import com.google.shopping.merchant.products.v1beta.ProductInputsServiceSettings;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;
/** This class demonstrates how to delete a product for a given Merchant Center account */
public class DeleteProductInputSample {
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);
}
}
public static void main(String[] args) throws Exception {
Config config = Config.load();
// An ID assigned to a product by Google. In the format
// channel~contentLanguage~feedLabel~offerId
String productId = "online~en~label~sku123";
// The name of the dataSource from which to delete the product. If it is a primary feed, this
// will delete the product completely. If it's a supplemental feed, it will only delete the
// product information from that feed, but the product will still be available from the primary
// feed.
String dataSource = "accounts/{account}/dataSources/{dataSource}";
deleteProductInput(config, productId, dataSource);
}
}
Lister les produits de votre compte
Pour lister les produits traités dans votre compte, utilisez la méthode accounts.products.list
, comme indiqué dans la requête suivante.
GET https://merchantapi.googleapis.com/products/v1beta/accounts/{ACCOUNT_ID} /products
Pour lister un produit pour un compte Merchant Center donné, vous pouvez utiliser la méthode google.shopping.merchant.accounts.v1beta.ListProductsRequest
, comme illustré dans l'exemple suivant.
import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.shopping.merchant.products.v1beta.ListProductsRequest;
import com.google.shopping.merchant.products.v1beta.Product;
import com.google.shopping.merchant.products.v1beta.ProductsServiceClient;
import com.google.shopping.merchant.products.v1beta.ProductsServiceClient.ListProductsPagedResponse;
import com.google.shopping.merchant.products.v1beta.ProductsServiceSettings;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;
/** This class demonstrates how to list all the products for a given merchant center account */
public class ListProductsSample {
private static String getParent(String accountId) {
return String.format("accounts/%s", accountId);
}
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);
}
}
public static void main(String[] args) throws Exception {
Config config = Config.load();
listProducts(config);
}
}