Los problemas de la cuenta afectan la visibilidad de tus productos y tu capacidad para participar en varios programas de Merchant Center. La sub-API de Accounts te permite recuperar una lista de los problemas que afectan tu cuenta de comerciante. Esto te ayuda a identificar y abordar los problemas de forma proactiva.
Eres responsable de cumplir con las políticas de los anuncios de Shopping y las fichas gratuitas. Google Shopping se reserva el derecho de aplicar estas políticas y responder según corresponda si detectamos contenido o comportamientos que las infrinjan.
Cada AccountIssue
proporciona detalles como los siguientes:
title
: Es un resumen del problema.severity
: Es la gravedad del problema. Estos son algunos ejemplos:CRITICAL
: Es un problema que impide que se publiquen las ofertas.ERROR
: Es un problema que puede afectar las ofertas o indicar un problema.SUGGESTION
: Es una recomendación para mejorar.
impactedDestinations
: Los programas (como los anuncios de Shopping o las fichas gratuitas) y las regiones afectados por el problema, junto con la gravedad en esos contextos.detail
: Es un mensaje con más contexto sobre el problema.documentationUri
: Es un vínculo al artículo del Centro de ayuda sobre cómo resolver el problema.
Consideraciones especiales
- Internacionalización (i18n): Cuando enumeres los problemas de la cuenta, puedes especificar un
language_code
(por ejemplo, "en-US", "fr-FR") y untime_zone
(como "America/Los_Angeles", "Europe/Paris") en tu solicitud. Esto verifica que las cadenas legibles en la respuesta, como el problemadetail
, estén localizadas de forma adecuada. Si no se proporcionan estos campos, la API usará el inglés ("en-US") y la zona horaria "America/Los_Angeles" (hora del Pacífico) de forma predeterminada. - Paginación: La API admite la paginación a través de los parámetros
page_size
ypage_token
en el objetoListAccountIssuesRequest
. Esto te permite recuperar problemas en fragmentos manejables. El valor máximo depage_size
es 1, 000 y el valor predeterminado es 50. - Orden: Los problemas que devuelve la API suelen ordenarse según la gravedad y una prioridad interna, de manera similar a como se muestran en Merchant Center. Ten en cuenta que la API no admite la ordenación personalizada.
- Fuente de datos: La sub-API de Accounts recupera datos del mismo backend que usa la página Diagnóstico en Merchant Center.
Recupera los problemas de tu cuenta
Para enumerar los problemas de la cuenta, envía una solicitud GET
al método accounts.issues.list
:
GET https://merchantapi.googleapis.com/accounts/v1/accounts/{ACCOUNT_ID}/issues?language_code=en-GB&time_zone.id=Europe/London&page_size=10
Esta es una respuesta de ejemplo para una cuenta secundaria que se suspendió por incumplimiento de la política de "página de destino que no funciona".
{
"accountIssues": [
{
"name": "accounts/ACCOUNT_ID/issues/home-page-issue",
"title": "Online store not confirmed",
"severity": "CRITICAL",
"impactedDestinations": [
{
"reportingContext": "SHOPPING_ADS",
"impacts": [
{
"regionCode": "001",
"severity": "CRITICAL"
}
]
}
],
"detail": "The ownership of the online store must be verified through Merchant Center",
"documentationUri": "https://support.google.com/merchants/answer/176793?hl=en-US"
},
{
"name": "accounts/ACCOUNT_ID/issues/editorial-and-professional-standards-destination-url-down-policy",
"title": "Landing page not working",
"severity": "CRITICAL",
"impactedDestinations": [
{
"reportingContext": "SHOPPING_ADS",
"impacts": [
{
"regionCode": "ES",
"severity": "CRITICAL"
}
]
},
{
"reportingContext": "DEMAND_GEN_ADS",
"impacts": [
{
"regionCode": "ES",
"severity": "CRITICAL"
}
]
},
{
"reportingContext": "VIDEO_ADS",
"impacts": [
{
"regionCode": "ES",
"severity": "CRITICAL"
}
]
}
],
"detail": "Broken landing pages or broken links in your online store are not allowed",
"documentationUri": "https://support.google.com/merchants/answer/12079604?hl=en-US"
},
{
"name": "accounts/ACCOUNT_ID/issues/pending-phone-verification",
"title": "Your phone number needs to be verified",
"severity": "CRITICAL",
"detail": "Verify your phone number to confirm your identity",
"documentationUri": "https://support.google.com/merchants/answer/12471579?hl=en-US"
},
{
"name": "accounts/ACCOUNT_ID/issues/pending-address-and-phone",
"title": "Missing business address",
"severity": "CRITICAL",
"detail": "Provide a valid business address in Merchant Center",
"documentationUri": "https://support.google.com/merchants/answer/12471579?hl=en-US"
}
]
}
Enumera los problemas de una cuenta específica
En este caso de uso, se muestra cómo recuperar todos los problemas a nivel de la cuenta para una cuenta de Merchant Center determinada. La información que se devuelve puede ayudarte a identificar y resolver problemas que afectan el rendimiento y la elegibilidad de tu cuenta para participar en diversos programas.
AppsScript
/**
* Lists all issues for a given Merchant Center account.
*/
function listAccountIssues() {
// IMPORTANT:
// Enable the Merchant API Accounts sub-API Advanced Service and call it
// "MerchantApiAccounts"
// Replace this with your Merchant Center ID.
const accountId = "<MERCHANT_CENTER_ID>";
// Construct the parent name
const parent = 'accounts/' + accountId;
try {
console.log('Sending list Account Issues request');
// Set pageSize to the maximum value (default: 50)
let pageSize = 100;
let pageToken;
let count = 0;
// Call the Account.Issues.list API method. Use the pageToken to iterate
// through all pages of results.
do {
response = MerchantApiAccounts.Accounts.Issues.list(parent, {pageSize, pageToken});
for (const issue of response.accountIssues) {
console.log(issue);
count++;
}
pageToken = response.nextPageToken;
} while (pageToken); // Exits when there is no next page token.
console.log('The following count of Account Issues were returned: ', count);
} catch (e) {
console.log('ERROR!');
console.log(e);
}
}
Java
import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.shopping.merchant.accounts.v1.AccountIssue;
import com.google.shopping.merchant.accounts.v1.AccountIssueServiceClient;
import com.google.shopping.merchant.accounts.v1.AccountIssueServiceClient.ListAccountIssuesPagedResponse;
import com.google.shopping.merchant.accounts.v1.AccountIssueServiceSettings;
import com.google.shopping.merchant.accounts.v1.AccountName;
import com.google.shopping.merchant.accounts.v1.ListAccountIssuesRequest;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;
/**
* This class demonstrates how to list all the account issues of an account.
*
* <p>If you want to query the account issues of all the sub-accounts of an advanced account, see
* ListAdvancedAccountIssuesSampleAsync.
*/
public class ListAccountIssuesSample {
public static void listAccountIssues(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.
AccountIssueServiceSettings accountIssueServiceSettings =
AccountIssueServiceSettings.newBuilder()
.setCredentialsProvider(FixedCredentialsProvider.create(credential))
.build();
// Calls the API and catches and prints any network failures/errors.
try (AccountIssueServiceClient accountIssueServiceClient =
AccountIssueServiceClient.create(accountIssueServiceSettings)) {
// Gets the account ID from the config file.
String accountId = config.getAccountId().toString();
// Creates account name to identify account.
String name = AccountName.newBuilder().setAccount(accountId).build().toString();
ListAccountIssuesRequest request =
ListAccountIssuesRequest.newBuilder().setParent(name).build();
System.out.println("Sending list account issues request:");
ListAccountIssuesPagedResponse response =
accountIssueServiceClient.listAccountIssues(request);
int count = 0;
// Iterates over all rows in all pages and prints the issue in each row.
// Automatically uses the `nextPageToken` if returned to fetch all pages of data.
for (AccountIssue accountIssue : response.iterateAll()) {
System.out.println(accountIssue);
count++;
}
System.out.print("The following count of account issues 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();
listAccountIssues(config);
}
}
PHP
use Google\ApiCore\ApiException;
use Google\Shopping\Merchant\Accounts\V1\Client\AccountIssueServiceClient;
use Google\Shopping\Merchant\Accounts\V1\ListAccountIssuesRequest;
/**
* Lists all the account issues of an account.
*/
class ListAccountIssues
{
/**
* A helper function to create the parent string.
*
* @param array $accountId
* The account.
*
* @return string The parent has the format: `accounts/{account_id}`
*/
private static function getParent($accountId)
{
return sprintf("accounts/%s", $accountId);
}
/**
* Lists all the account issues for a given Merchant Center account.
*
* @param array $config
* The configuration data used for authentication and getting the acccount ID.
* @return void
*/
public static function listAccountIssuesSample($config): void
{
// Gets the OAuth credentials.
$credentials = Authentication::useServiceAccountOrTokenFile();
// Creates options config.
$options = ['credentials' => $credentials];
// Creates a client.
$accountIssueServiceClient = new AccountIssueServiceClient($options);
// Creates parent.
$parent = self::getParent($config['accountId']);
// Creates the request.
$request = new ListAccountIssuesRequest(['parent' => $parent]);
// Calls the API and catches and prints any network failures/errors.
try {
print "Sending list account issues request:\n";
$response = $accountIssueServiceClient->listAccountIssues($request);
$count = 0;
// Iterates over all elements and prints the issue in each row.
foreach ($response->iterateAllElements() as $accountIssue) {
print_r($accountIssue);
$count++;
}
print "The following count of account issues were returned: ";
print $count . "\n";
} catch (ApiException $e) {
print "An error has occured: \n";
print $e->getMessage() . "\n";
}
}
/**
* Helper to execute the sample.
*
* @return void
*/
public function callSample(): void
{
$config = Config::generateConfig();
// Lists the account issues.
self::listAccountIssuesSample($config);
}
}
// Run the script
$sample = new ListAccountIssues();
$sample->callSample();
Python
from examples.authentication import configuration
from examples.authentication import generate_user_credentials
from google.shopping.merchant_accounts_v1 import AccountIssueServiceClient
from google.shopping.merchant_accounts_v1 import ListAccountIssuesRequest
_ACCOUNT = configuration.Configuration().read_merchant_info()
_PARENT = f"accounts/{_ACCOUNT}"
def list_account_issues():
"""Lists all the account issues of an account."""
# Gets OAuth Credentials.
credentials = generate_user_credentials.main()
# Creates a client.
client = AccountIssueServiceClient(credentials=credentials)
request = ListAccountIssuesRequest(parent=_PARENT)
print("Sending list account issues request:")
# Makes the request and catches and prints any error messages.
try:
response = client.list_account_issues(request=request)
count = 0
for account_issue in response:
print(account_issue)
count += 1
print("The following count of account issues were returned: ")
print(count)
except RuntimeError as e:
print("An error has occured: ")
print(e)
if __name__ == "__main__":
list_account_issues()
cURL
curl -X GET \
"https://merchantapi.googleapis.com/accounts/v1/accounts/{ACCOUNT_ID}/issues?language_code=en-US&time_zone.id=America/Los_Angeles&page_size=50" \
--header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
--header "Accept: application/json"
Enumera los problemas de la cuenta para todas las cuentas secundarias de una cuenta avanzada
Si administras una cuenta avanzada, es posible que debas verificar si hay problemas en todas tus cuentas secundarias. En este ejemplo, se muestra cómo enumerar las cuentas secundarias y, luego, para cada una de ellas, recuperar de forma asíncrona sus problemas. Este enfoque es eficiente para administrar varias cuentas.
Java
import static com.google.api.core.ApiFutures.transform;
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.accounts.v1.AccountIssueServiceClient;
import com.google.shopping.merchant.accounts.v1.AccountIssueServiceSettings;
import com.google.shopping.merchant.accounts.v1.AccountName;
import com.google.shopping.merchant.accounts.v1.AccountsServiceClient;
import com.google.shopping.merchant.accounts.v1.AccountsServiceClient.ListSubAccountsPagedResponse;
import com.google.shopping.merchant.accounts.v1.AccountsServiceSettings;
import com.google.shopping.merchant.accounts.v1.ListAccountIssuesRequest;
import com.google.shopping.merchant.accounts.v1.ListAccountIssuesResponse;
import com.google.shopping.merchant.accounts.v1.ListSubAccountsRequest;
import java.io.IOException;
import java.util.AbstractMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.Executor;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;
/**
* This class demonstrates how to list the account issues of all the sub-accounts of an advanced
* account.
*/
public class ListAdvancedAccountIssuesAsyncSample {
/** Returns the list of issues for the given account. */
private static ApiFuture<ListAccountIssuesResponse> getAccountIssues(
AccountIssueServiceClient accountIssueServiceClient, String account) {
return accountIssueServiceClient
.listAccountIssuesCallable()
.futureCall(ListAccountIssuesRequest.newBuilder().setParent(account).build());
}
/**
* Returns a map of account issues where key is the sub-account resource name and the value is the
* list of issues for each sub-account. Takes the API clients and the name of the advanced account
* as input.
*/
private static ApiFuture<Map<String, ListAccountIssuesResponse>> getSubAccountIssues(
AccountsServiceClient accountsServiceClient,
AccountIssueServiceClient accountIssueServiceClient,
String advancedAccount)
throws IOException {
// Creates a direct executor to run the transform functions.
Executor executor = MoreExecutors.directExecutor();
// The parent has the format: accounts/{account}
ListSubAccountsRequest request =
ListSubAccountsRequest.newBuilder().setProvider(advancedAccount).build();
System.out.println("Sending list subaccounts request:");
// Lists all sub-accounts of the advanced account.
ListSubAccountsPagedResponse listSubAccountsResponse =
accountsServiceClient.listSubAccounts(request);
// Iterates over all subAccounts and lists account issues for each.
// Automatically uses the `nextPageToken` if returned to fetch all pages of data.
List<ApiFuture<AbstractMap.SimpleEntry<String, ListAccountIssuesResponse>>>
accountIssuesFutures =
StreamSupport.stream(listSubAccountsResponse.iterateAll().spliterator(), false)
.map(
account ->
transform(
getAccountIssues(accountIssueServiceClient, account.getName()),
(ListAccountIssuesResponse response) ->
new AbstractMap.SimpleEntry<>(account.getName(), response),
executor))
.collect(Collectors.toList());
// Collects all the responses into a single future.
ApiFuture<List<AbstractMap.SimpleEntry<String, ListAccountIssuesResponse>>> accountIssuesList =
ApiFutures.allAsList(accountIssuesFutures);
// Transforms the list of responses into a map.
return transform(
accountIssuesList,
(List<AbstractMap.SimpleEntry<String, ListAccountIssuesResponse>> list) ->
list.stream()
.collect(
Collectors.toMap(
AbstractMap.SimpleEntry::getKey,
AbstractMap.SimpleEntry::getValue,
(a, b) -> a)),
executor);
}
public static void listAccountIssues(Config config) throws Exception {
// Obtains OAuth token based on the user's configuration.
GoogleCredentials credential = new Authenticator().authenticate();
// Gets the account ID from the config file.
// Make sure to use the advanced account ID here, otherwise the API will return an error.
String accountId = config.getAccountId().toString();
// Creates account name to identify account.
String parent = AccountName.newBuilder().setAccount(accountId).build().toString();
// Creates service settings using the credentials retrieved above.
AccountsServiceSettings accountsServiceSettings =
AccountsServiceSettings.newBuilder()
.setCredentialsProvider(FixedCredentialsProvider.create(credential))
.build();
// Creates service settings using the credentials retrieved above.
AccountIssueServiceSettings accountIssueServiceSettings =
AccountIssueServiceSettings.newBuilder()
.setCredentialsProvider(FixedCredentialsProvider.create(credential))
.build();
// Calls the API and catches and prints any network failures/errors.
try (AccountsServiceClient accountsServiceClient =
AccountsServiceClient.create(accountsServiceSettings);
AccountIssueServiceClient accountIssueServiceClient =
AccountIssueServiceClient.create(accountIssueServiceSettings)) {
ApiFuture<Map<String, ListAccountIssuesResponse>> subAccountIssues =
getSubAccountIssues(accountsServiceClient, accountIssueServiceClient, parent);
ApiFutures.addCallback(
subAccountIssues,
new ApiFutureCallback<Map<String, ListAccountIssuesResponse>>() {
@Override
public void onSuccess(Map<String, ListAccountIssuesResponse> results) {
System.out.println("Account Issues");
for (Entry<String, ListAccountIssuesResponse> entry : results.entrySet()) {
System.out.println("Issues for account " + entry.getKey());
System.out.println(entry.getValue());
}
}
@Override
public void onFailure(Throwable throwable) {
System.out.println(throwable);
}
},
MoreExecutors.directExecutor());
} 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();
listAccountIssues(config);
}
}
cURL
Para enumerar los problemas de las cuentas secundarias de una cuenta avanzada, primero deberás enumerar las cuentas secundarias (p.ej., con accounts.listSubaccounts
) y, luego, iterar cada ID de cuenta secundaria para llamar al método accounts.issues.list
. En el siguiente ejemplo de curl, se muestra cómo enumerar los problemas de una sola subcuenta. Repite esta solicitud para cada ID de cuenta secundaria.
curl -X GET \
"https://merchantapi.googleapis.com/accounts/v1/accounts/{SUB_ACCOUNT_ID}/issues?language_code=en-US&time_zone.id=America/Los_Angeles&page_size=50" \
--header "Authorization: Bearer {YOUR_ACCESS_TOKEN}" \
--header "Accept: application/json"
```