Objetos, métodos e serviços

Este guia apresenta os métodos e objetos da Google AdWords API usando alguns exemplos de tarefas de gerenciamento de campanhas comuns. Ele também descreve os serviços oferecidos pela API, com links para as páginas de referência correspondentes.

Os exemplos de código deste guia utilizam a biblioteca Java da Google AdWords API. Para ver outras linguagens de programação, consulte a lista completa de bibliotecas cliente.

A Google AdWords API destina-se aos usuários avançados do Google AdWords. Caso você não tenha experiência com o Google AdWords ou precise relembrar os conceitos básicos, consulte o Guia de primeiros passos do Google AdWords.

Escopo e hierarquia de objetos

Toda conta do Google AdWords pode ser visualizada como uma hierarquia de objetos.

Em cada conta, há uma ou mais Campaigns que representam as campanhas de publicidade que você está exibindo.

Cada campanha tem vários AdGroups, usados para organizar seus anúncios em grupos lógicos.

Cada "AdGroup" contém vários AdGroupAds e AdGroupCriteria. Um "AdGroupAd" representa um anúncio que você está exibindo. Um "AdGroupCriterion" representa um critério (uma palavra-chave) que define a forma como o anúncio é acionado.

Você pode designar critérios de campanha, que definem regras para toda a campanha sobre a forma como os anúncios são acionados. Também é possível especificar orçamentos e datas para toda a campanha.

Você também pode usar extensões de anúncio no nível da campanha para incluir mais informações nos seus anúncios, como número de telefone, endereço etc.

Cada objeto do Google AdWords é identificado pelo seu próprio código. Alguns desses códigos são exclusivos em um nível global em todas as contas do Google AdWords, enquanto outros são exclusivos apenas dentro de determinado escopo. Confira abaixo a exclusividade de cada código de objeto no Google AdWords.

Código do objeto Escopo de exclusividade Globalmente exclusivo?
Budget ID Global Sim
Campaign ID Global Sim
AdGroup ID Global Sim
Ad ID Grupo de anúncios Não. O par (AdGroupId, AdId) é globalmente exclusivo.
AdGroupCriterion ID Grupo de anúncios Não. O par (AdGroupId, CriterionId) é globalmente exclusivo.
CampaignCriterion ID Campanha Não. O par (CampaignId, CriterionId) é globalmente exclusivo.
Ad Extensions Campanha Não. O par (CampaignId, AdExtensionId) é globalmente exclusivo.
Feed ID Global Sim
Feed Item ID Global Sim
Feed Attribute ID Feed Não
Feed Mapping ID Global Sim
Label ID Global Sim

Essas regras de código podem ser úteis ao desenvolver um banco de dados local para armazenar seus objetos do Google AdWords.

Se um objeto é derivado de outro, ele também tem um campo Type. Por exemplo, TextAd tem um campo Type para indicar que é derivado do objeto Ad. Se você estiver usando uma linguagem dinâmica, poderá utilizar esse campo para confirmar se um objeto Ad é do tipo TextAd.

Métodos e operações

A Google AdWords API oferece serviços para gerenciar objetos do Google AdWords. Por exemplo, CampaignService gerencia "Campaigns", AdGroupService gerencia "AdGroups", e assim por diante.

Todos esses serviços expõem dois métodos padrão get e mutate.

Método "get"

O método get é usado para recuperar objetos do Google AdWords. Por exemplo, você pode usar CampaignService.get para recuperar a lista de campanhas.

Cada método get usa um seletor como entrada e retorna uma página como resultado. A Google AdWords API não retorna todos os campos de um objeto por padrão. É necessário especificar a lista de campos que você deseja recuperar ao criar um seletor.

Você pode usar comportamentos para filtrar seus resultados, ordenação para classificar seus resultados e dateRange para limitar o período dos resultados recuperados.

Se você estiver recuperando vários objetos, também será necessário especificar a paginação. Se você tentar recuperar vários objetos sem essa especificação, a Google AdWords API acionará um SizeLimitError.RESPONSE_SIZE_LIMIT_EXCEEDED.

O snippet de código a seguir, que recupera e exibe todas as campanhas em uma conta, mostra como funcionam esses conceitos.

// Get the CampaignService.
CampaignServiceInterface campaignService =
    adWordsServices.get(session, CampaignServiceInterface.class);

int offset = 0;

// Create selector.
SelectorBuilder builder = new SelectorBuilder();
Selector selector = builder
    .fields(CampaignField.Id, CampaignField.Name)
    .orderAscBy(CampaignField.Name)
    .offset(offset)
    .limit(PAGE_SIZE)
    .build();

CampaignPage page = null;
do {
  // Get all campaigns.
  page = campaignService.get(selector);

  // Display campaigns.
  if (page.getEntries() != null) {
    for (Campaign campaign : page.getEntries()) {
      System.out.printf("Campaign with name '%s' and ID %d was found.%n", campaign.getName(),
          campaign.getId());
    }
  } else {
    System.out.println("No campaigns were found.");
  }

  offset += PAGE_SIZE;
  selector = builder.increaseOffsetBy(PAGE_SIZE).build();
} while (offset < page.getTotalNumEntries());

Consulte a página de referência de campos de seletor para ver os campos de seletor disponíveis para diferentes serviços.

Nossas bibliotecas cliente incluem amostras de código que usam o método get em todos os serviços de gerenciamento de campanhas. Abaixo, veja exemplos de biblioteca cliente para serviços de gerenciamento de campanhas de cada linguagem.

Método "query"

O método query é uma alternativa para o método get que utiliza uma linguagem semelhante a SQL, chamada Linguagem de consulta do Google AdWords (AWQL, na sigla em inglês), em vez de seletores. Normalmente, a codificação da mesma solicitação em AWQL é mais eficiente. O método query aceita a maioria dos serviços comuns. Lembre-se de que a AWQL não aceita a modificação de dados.

Para ver a eficiência da AWQL, considere o exemplo acima. Em vez de escrever quatro linhas para o seletor, escreva uma só string que contenha todas as mesmas informações.

String query = "SELECT Id, Name, Status ORDER BY Name";

Não há uma cláusula "FROM". Isso ocorre porque o serviço cujo método query você está usando já determina o local de onde ele é selecionado. A AWQL só aceita a cláusula "FROM" quando é utilizada para relatórios. Para usar essa string, basta chamar o método "query" do serviço.

CampaignPage page = null;
do {
  String pageQuery = query + String.format(" LIMIT %d, %d", offset, PAGE_SIZE);
  // Get all campaigns.
  page = campaignService.query(pageQuery);

  // Display campaigns.
  if (page.getEntries() != null) {
    for (Campaign campaign : page.getEntries()) {
      System.out.printf("Campaign with name '%s' and ID %d was found.%n", campaign.getName(),
          campaign.getId());
    }
  } else {
    System.out.println("No campaigns were found.");
  }

  offset += PAGE_SIZE;
} while (offset < page.getTotalNumEntries());

A chamada gera o mesmo resultado que a chamada get no exemplo acima. A AWQL pode ser uma maneira mais rápida e intuitiva de escrever solicitações com uma chamada get. Para saber mais, consulte o Guia da AWQL.

Método "mutate"

O método mutate é usado para modificar (criar, atualizar ou remover) um objeto do Google AdWords.

Para modificar um objeto, você precisa criar um objeto Operation correspondente. Por exemplo, é preciso criar uma CampaignOperation para modificar uma Campaign.

O campo operador define o tipo de operação que você deseja realizar ("ADD", "SET" ou "REMOVE"). O campo "operando" contém o objeto que você deseja modificar. Veja a seguir como o snippet de código adiciona as campanhas:

// Get the CampaignService.
CampaignServiceInterface campaignService =
    adWordsServices.get(session, CampaignServiceInterface.class);

// Create campaign.
Campaign campaign = new Campaign();
campaign.setName("Interplanetary Cruise #" + System.currentTimeMillis());
campaign.setStatus(CampaignStatus.PAUSED);
BiddingStrategyConfiguration biddingStrategyConfiguration = new BiddingStrategyConfiguration();
biddingStrategyConfiguration.setBiddingStrategyType(BiddingStrategyType.MANUAL_CPC);

// You can optionally provide a bidding scheme in place of the type.
ManualCpcBiddingScheme cpcBiddingScheme = new ManualCpcBiddingScheme();
cpcBiddingScheme.setEnhancedCpcEnabled(false);
biddingStrategyConfiguration.setBiddingScheme(cpcBiddingScheme);

campaign.setBiddingStrategyConfiguration(biddingStrategyConfiguration);

// You can optionally provide these field(s).
campaign.setStartDate(new DateTime().plusDays(1).toString("yyyyMMdd"));
campaign.setEndDate(new DateTime().plusDays(30).toString("yyyyMMdd"));
campaign.setAdServingOptimizationStatus(AdServingOptimizationStatus.ROTATE);
campaign.setFrequencyCap(new FrequencyCap(5L, TimeUnit.DAY, Level.ADGROUP));

// Only the budgetId should be sent, all other fields will be ignored by CampaignService.
Budget budget = new Budget();
budget.setBudgetId(budgetId);
campaign.setBudget(budget);

campaign.setAdvertisingChannelType(AdvertisingChannelType.SEARCH);

// Set the campaign network options to Search and Search Network.
NetworkSetting networkSetting = new NetworkSetting();
networkSetting.setTargetGoogleSearch(true);
networkSetting.setTargetSearchNetwork(true);
networkSetting.setTargetContentNetwork(false);
networkSetting.setTargetPartnerSearchNetwork(false);
campaign.setNetworkSetting(networkSetting);

// Set options that are not required.
GeoTargetTypeSetting geoTarget = new GeoTargetTypeSetting();
geoTarget.setPositiveGeoTargetType(GeoTargetTypeSettingPositiveGeoTargetType.DONT_CARE);
campaign.setSettings(new Setting[] {geoTarget});

// You can create multiple campaigns in a single request.
Campaign campaign2 = new Campaign();
campaign2.setName("Interplanetary Cruise banner #" + System.currentTimeMillis());
campaign2.setStatus(CampaignStatus.PAUSED);
BiddingStrategyConfiguration biddingStrategyConfiguration2 = new BiddingStrategyConfiguration();
biddingStrategyConfiguration2.setBiddingStrategyType(BiddingStrategyType.MANUAL_CPC);
campaign2.setBiddingStrategyConfiguration(biddingStrategyConfiguration2);

Budget budget2 = new Budget();
budget2.setBudgetId(budgetId);
campaign2.setBudget(budget2);

campaign2.setAdvertisingChannelType(AdvertisingChannelType.DISPLAY);

// Create operations.
CampaignOperation operation = new CampaignOperation();
operation.setOperand(campaign);
operation.setOperator(Operator.ADD);
CampaignOperation operation2 = new CampaignOperation();
operation2.setOperand(campaign2);
operation2.setOperator(Operator.ADD);

CampaignOperation[] operations = new CampaignOperation[] {operation, operation2};

// Add campaigns.
CampaignReturnValue result = campaignService.mutate(operations);

// Display campaigns.
for (Campaign campaignResult : result.getValue()) {
  System.out.printf("Campaign with name '%s' and ID %d was added.%n", campaignResult.getName(),
      campaignResult.getId());
}

Nossas bibliotecas cliente incluem exemplos de código que usam o método mutate em todos os serviços de gerenciamento de campanhas.

Ao modificar objetos, há um número limitado de objetos de determinado tipo que uma conta do Google AdWords pode conter. Os limites para vários tipos de objeto do Google AdWords estão descritos neste artigo da Central de Ajuda. Em vez de codificar esses limites no seu aplicativo, use-os apenas como referência ao planejar suas campanhas.

Ao fazer chamadas mutate, é recomendável enviar várias operações por solicitação em vez de enviar diversas solicitações com uma operação por solicitação. O envio de várias operações por solicitação reduz o número de idas e voltas ao servidor e aprimora o desempenho do seu aplicativo.

Outra dica de otimização é agrupar suas solicitações por operações em uma só entidade mãe. Por exemplo, ao adicionar anúncios, tente agrupar suas solicitações em um só grupo de anúncios em vez de uma solicitação em vários grupos de anúncios. Consulte o guia de práticas recomendadas para ver mais informações.

Campo "operador"

Conforme mencionado acima, o campo operador indica o tipo de operação de modificação que você deseja realizar: "ADD", "SET" ou "REMOVE".

A operação "ADD" destina-se a criar um novo objeto, "SET" destina-se a atualizar um objeto existente e "REMOVE", a remover um objeto existente. No entanto, às vezes alguns operadores não são aplicáveis a determinados serviços.

Por exemplo, não é possível remover permanentemente uma campanha do Google AdWords depois que ela é criada. Você pode apenas marcá-la como removida. Mesmo quando ela está marcada como removida, você ainda pode consultar os detalhes e estatísticas da campanha.

A Google AdWords API não aceita o operador "REMOVE" em "CampaignService". É necessário atualizar "Campaign" alterando seus status para "REMOVED" usando o operador "SET".

Por outro lado, as segmentações de campanha não podem ser alteradas. Você pode usar apenas "ADD" ou "REMOVE" nesses objetos.

A tabela abaixo explica como controlar o fluxo de diferentes objetos do Google AdWords para atingir um status desejado:

Tipo Adicionar novo objeto Ativar Pausar Remover / desativar
Campaign ação: mutate
operação: ADD
status: ENABLED
ação: mutate
operação: SET
status: ENABLED
ação: mutate
operação: SET
status: PAUSED
ação: mutate
operação: SET
status: REMOVED
AdGroup ação: mutate
operação: ADD
status: ENABLED
ação: mutate
operação: SET
status: ENABLED
ação: mutate
operação: SET
status: PAUSED
ação: mutate
operação: SET
status: REMOVED
AdGroupAd ação: mutate
operação: ADD
status: ENABLED
ação: mutate
operação: SET
status: ENABLED
ação: mutate
operação: SET
status: PAUSED
ação: mutate
operação: REMOVE
status: DISABLED
BiddableAdGroupCriterion ação: mutate
operação: ADD
status: ENABLED
ação: mutate
operação: SET
status: ENABLED
ação: mutate
operação: SET
status: PAUSED
ação: mutate
operação: REMOVE
status: REMOVED
UserList ação: mutate
operação: ADD
status: OPEN
N/A N/A ação: mutate
operação: SET
status: CLOSED
Experiment ação: mutate
operação: ADD
status: ENABLED
N/A N/A ação: mutate
operação: SET
status: REMOVED
Feed ação: mutate
operação: ADD
status: ENABLED
N/A N/A ação: mutate
operação: REMOVE
status: REMOVED
FeedMapping ação: mutate
operação: ADD
status: ENABLED
N/A N/A ação: mutate
operação: REMOVE
status: REMOVED
FeedItem ação: mutate
operação: ADD
status: ENABLED
N/A N/A ação: mutate
operação: REMOVE
status: REMOVED
CustomerFeed ação: mutate
operação: ADD
status: ENABLED
N/A N/A ação: mutate
operação: REMOVE
status: REMOVED
CampaignFeed ação: mutate
operação: ADD
status: ENABLED
N/A N/A ação: mutate
operação: REMOVE
status: REMOVED
AdGroupFeed ação: mutate
operação: ADD
status: ENABLED
N/A N/A ação: mutate
operação: REMOVE
status: REMOVED

Modificações simultâneas

Caso muitos usuários estejam atualizando o mesmo objeto com o seu aplicativo ou se você está modificando os objetos do Google AdWords paralelamente por meio de várias conversas para ter um rendimento melhor, é importante entender como o Google AdWords lida com solicitações de modificação simultânea para o mesmo objeto.

Um objeto do Google AdWords não pode ser modificado simultaneamente por mais de uma origem. Isso inclui a atualização do objeto por meio de conversas no mesmo aplicativo ou em outros aplicativos (por exemplo, seu aplicativo e uma sessão simultânea do AdWords Editor). A API não oferece uma maneira de bloquear um objeto antes da atualização. Se duas origens tentam modificar simultaneamente um objeto, a API aciona um CONCURRENT_MODIFICATION_ERROR.

Saiba mais sobre o gerenciamento simultâneo da Google AdWords API nesta postagem do blog.

Modificações síncronas x assíncronas

Os métodos de modificação da Google AdWords API são síncronos: As chamadas de API retornam uma resposta somente depois da modificação dos objetos, e você precisa esperar a resposta de cada solicitação. Embora a codificação dessa abordagem seja relativamente simples, ela pode comprometer o balanceamento de carga e desperdiçar recursos enquanto as máquinas aguardam a conclusão de uma chamada.

Uma abordagem alternativa consiste em modificar os objetos de modo assíncrono usando o BatchJobService, que oferece uma maneira de executar lotes de operações em vários serviços sem precisar aguardar a conclusão das operações. Após o envio da tarefa em lote, os servidores da Google AdWords API realizam as operações de modo assíncrono, permitindo que sua máquina realize outras operações e verifique periodicamente o status da tarefa até a conclusão.

Consulte o guia de processamento em lote para saber mais sobre o processamento assíncrono.

Validação da modificação

Com o cabeçalho SOAP validateOnly, você pode testar suas chamadas de API com base em dados reais, sem precisar executar a chamada. É possível realizar o teste para saber se há parâmetros ausentes e valores de campo incorretos sem a necessidade de realizar a operação.

Para usar esse recurso, defina o campo validateOnly como true no RequestHeader. Por padrão, as bibliotecas cliente definem esse campo como false.

A solicitação é totalmente validada como se fosse ser realizada, mas a execução final é ignorada. Quando nenhum erro é encontrado, uma resposta em branco é retornada. Quando há falha na avaliação, mensagens de erro indicam os pontos de falha.

Veja um exemplo de como configurar o campo validateOnly usando a biblioteca Java.

Credential oAuth2Credential = new OfflineCredentials.Builder()
    .forApi(Api.ADWORDS)
    .fromFile()
    .build()
    .generateCredential();

AdWordsSession session = new AdWordsSession.Builder()
    .fromFile()
    .withOAuth2Credential(oAuth2Credential)
    .build();

session.setValidateOnly(true);

As chamadas de API realizadas usando essa sessão têm o cabeçalho validateOnly definido como true.

O cabeçalho validateOnly é especialmente útil para testar os anúncios e descobrir se há violações comuns da política. Os anúncios que violam as políticas (por exemplo, ao usar determinadas palavras, durações, letras maiúsculas ou pontuação) são rejeitados automaticamente. Quando você tenta fazer o upload de anúncios em lote, mas um deles está com problema, pode ocorrer falha em todo o restante do lote. Ao testar um novo anúncio com o campo validateOnly, você pode ver facilmente quais anúncios seriam rejeitados. Consulte o exemplo de código sobre como lidar com erros de violação de política para ver como isso funciona.

Caso você não esteja usando uma biblioteca cliente, basta configurar o cabeçalho SOAP correto para poder continuar validando suas solicitações de modificação.

Serviços da Google AdWords API

Esta seção descreve os serviços fornecidos pela Google AdWords API, com links para páginas de referência que contêm detalhes adicionais de cada serviço.

Os serviços da Google AdWords API podem ser agrupados em quatro categorias funcionais:

Gerenciamento de dados de campanhas

Use os serviços de gerenciamento de dados de campanhas para trabalhar com as campanhas do Google AdWords e suas entidades associadas. Cada serviço de gerenciamento de dados de campanhas corresponde a uma entidade na hierarquia de dados de campanhas.

Serviço Descrição
CampaignService Criar, atualizar e remover campanhas. Uma campanha organiza um ou mais grupos de anúncios e tem suas próprias configurações de segmentação, período de veiculação, estratégia de lances e orçamento.
AdGroupService Criar, atualizar e remover grupos de anúncios. Um grupo de anúncios organiza um conjunto de anúncios e critérios ao mesmo tempo, além de especificar o lance padrão para seus critérios.
AdGroupAdService Criar, atualizar e remover anúncios.
CampaignExtensionSettingService Criar, atualizar e remover extensões de anúncio. As extensões de anúncio das campanhas aprimoram os anúncios de texto padrão incluindo informações de local, links adicionais ou um número de telefone em todos os anúncios de uma campanha.
CampaignCriterionService
AdGroupCriterionService
Criar, atualizar e remover critérios. Um critério descreve as condições que determinam se um anúncio deve ser exibido.
ConversionTrackerService
OfflineConversionFeedService
Avaliar a eficiência dos anúncios e palavras-chave ao descobrir o que acontece depois que um usuário clica no seu anúncio. O serviço OfflineConversionFeedService lida com a importação de conversões off-line.
DataService Recuperar os dados de gerenciamento de campanhas de anúncios com base nos critérios especificados.
FeedService
FeedItemService
FeedMappingService
AdGroupFeedService
CampaignFeedService
Criar feeds de dados personalizados para gerenciar extensões de link no aplicativo, telefone e site.
AdwordsUserListService Criar, atualizar e remover listas de usuários. As listas de usuários e seus respectivos critérios exibem anúncios às pessoas que já acionaram um evento de conversão no seu website.
BudgetService Criar, atualizar e remover os orçamentos. Usado para gerenciar orçamentos que podem ser compartilhados em diferentes campanhas.

Otimização

Use os serviços de otimização para recuperar estatísticas de desempenho e ter ideias para novos critérios.

Serviço Descrição
ReportDefinitionService Criar e fazer o download de vários relatórios de desempenho.
TargetingIdeaService Gerar novas ideias de canais e palavras-chave com base nos parâmetros que você especifica,
TrafficEstimatorService Ver estimativas de tráfego para campanhas, palavras-chave e grupos de anúncios propostos.
ExperimentService Criar e realizar experiências de campanha em que você pode testar palavras-chave, lances e canais.

Gerenciamento da conta

Utilizar os serviços de gerenciamento da conta para acompanhar a atividade da sua conta.

Serviço Descrição
CustomerService Recuperar detalhes básicos sobre a conta de um cliente.
CustomerSyncService Recuperar um registro de alterações de dados de campanhas em um período específico.
ManagedCustomerService Gerenciar contas de cliente e vinculações entre contas de cliente e de administrador.

Utilitário

Use estes serviços de utilitário para realizar várias tarefas úteis com a Google AdWords API.

Serviço Descrição
BatchJobService Processar de modo assíncrono um grande lote de operações de dados de campanhas. Comparadas às chamadas síncronas para os serviços da Web padrão, as tarefas de processamento em lote levam mais tempo para ser concluídas, porém oferecem outras vantagens, conforme descrito no Guia de processamento em lote.
GeoLocationService Recuperar o endereço canônico e as coordenadas de um endereço especificado.
MediaService Fazer o upload e recuperar os códigos de mídia que você utiliza em anúncios com base em mídia (como anúncios gráficos ou em vídeo).
ConstantDataService Recuperar valores constantes utilizados pela API.
LocationCriterionService Recuperar o código de um critério "Location".

Dados da campanha

O trabalho com os dados da campanha é uma das tarefas fundamentais que você realiza com a Google AdWords API. A tabela abaixo descreve cada entidade de dados da campanha e sua relação com outros dados da campanha.

Entidade
Entidades filha (quantidade)
Tipo de dados Descrição
Campanha
Grupos de anúncios (1+)
Listas de segmentações da campanha (7)
Extensões de anúncio da campanha (0+)
Critérios da campanha (0+)
Campaign As campanhas organizam um ou mais grupos de anúncios e têm seus próprios período de veiculação, estratégia de lances e orçamento.
Grupo de anúncios
Anúncios (1+)
Critérios (1+)
AdGroup
Um grupo de anúncios organiza um conjunto de anúncios e critérios, além de especificar o lance padrão para seus critérios.
Anúncio
Modificações de extensões de anúncio (0+)
AdGroupAd Os tipos de anúncio disponíveis são documentados na referência da API como subclasses do tipo de Anúncio abstrato.
Critério
Nenhum
AdGroupCriterion, CampaignCriterion Um critério descreve as condições que determinam se um anúncio deve ser exibido (critério disponível para lances) ou não (critério negativo). Um critério de grupo de anúncios afeta os anúncios no grupo de anúncios pai. Um critério de campanha, que sempre é negativo, define condições que impedem a exibição dos anúncios da campanha.
Extensão de anúncio
Nenhum
CampaignExtensionSetting As extensões de anúncio das campanhas aprimoram os anúncios de texto padrão incluindo informações de local, links adicionais ou um número de telefone em todos os anúncios de uma campanha.
Feed
Nenhum
Feed Os feeds funcionam como canais de dados para as extensões de anúncio (sitelink, telefone, aplicativo etc.).
Lista de usuários
Nenhum
UserList As listas de usuários acompanham os usuários que já demonstraram interesse no seu website. Você pode segmentar os anúncios a este conjunto de usuários. Para isso, crie um critério de lista de usuários e vincule-o a uma lista de usuários existente.
Orçamento
Nenhum
Orçamento Os orçamentos são usados para gerenciar a quantidade de dinheiro gasto nas campanhas. Um orçamento pode ser compartilhado em diferentes campanhas, e o sistema determina a alocação ideal.

Enviar comentários sobre…

Precisa de ajuda? Acesse nossa página de suporte.