API Android Developer Console

A API Android Developer Console é um serviço RESTful que permite que desenvolvedores verificados automatizem os fluxos de trabalho de verificação de desenvolvedor Android no Android Developer Console, incluindo a recuperação de contas de desenvolvedor, a verificação dos principais requisitos de qualificação, o registro de nomes de pacotes do Android, o registro de chaves de assinatura de apps e a verificação da propriedade de chaves.

Visão geral, casos de uso e contexto de implementação

Principais casos de uso e recursos

  • Registro automatizado de nomes de pacotes de CI/CD:registre dezenas ou centenas de nomes de pacotes Android de forma programática (CreateAndroidPackage).
  • Inspeção prévia da política de chaves históricas:inspecione de forma programática se o Google já observou um nome de pacote no ecossistema e se o registro de um certificado de assinatura específico requer a verificação de propriedade da chave (GetAndroidPackageRegistrationPolicy).
  • Registro automatizado de chaves de assinatura de apps e verificação de propriedade:registre impressões digitais SHA-256 de certificados de assinatura pública (CreateAndroidPackageKey), recupere tokens de desafio de verificação exclusivos (verificationToken) e automatize a comprovação de posse de chaves privadas usando uploads de APKs assinados de solicitação única ou retomáveis (VerifyAndroidPackageKeyOwnership).
  • Envio de justificativa programática:envie justificativas de propriedade (JustifyAndroidPackageKeyRegistration).
  • Monitoramento de status:monitore o status de registro em contas de desenvolvedor, nomes de pacotes e chaves de assinatura de apps (GetDeveloperAccount, ListDeveloperAccounts, GetAndroidPackage, ListAndroidPackages, GetAndroidPackageKey, ListAndroidPackageKeys).

Fluxo de trabalho de implementação de ponta a ponta

  1. Verificar a identidade do desenvolvedor uma vez na interface:conclua a verificação de identidade do desenvolvedor (INDIVIDUAL ou ORGANIZATION) no Android Developer Console para que verificationState seja VERIFIED.
  2. Ative a API e faça a autenticação:ative androiddeveloperconsole.googleapis.com no projeto na nuvem do Google Cloud e receba um token de acesso do portador do OAuth 2.0 delegado pelo usuário com o escopo https://www.googleapis.com/auth/androiddeveloperconsole.
  3. Descubra o nome do recurso da sua conta de desenvolvedor:chame GET /v1/developerAccounts (ListDeveloperAccounts) para recuperar developerAccounts/{developer_account} e verifique se verificationState é VERIFIED.
  4. Verifique a política de registro do nome do pacote:chame GET /v1/developerAccounts/{id}/androidPackages/{pkg}/registrationPolicy (GetAndroidPackageRegistrationPolicy) para inspecionar keySelectionStrategy (SELECT_KEY_FROM_LIST ou USE_ANY_KEY) e todas as chaves de assinatura históricas conhecidas (knownKeys).
  5. Criar o recurso de pacote do Android:chame POST /v1/developerAccounts/{id}/androidPackages?androidPackageId={pkg} (CreateAndroidPackage) com o corpo {"name": ""} (cria o recurso no estado DRAFT).
  6. Registre a impressão digital da chave de assinatura do app:chame POST /v1/developerAccounts/{id}/androidPackages/{pkg}/keys (CreateAndroidPackageKey) com o corpo JSON {"certificateFingerprintSha256": "..."}. Inspecione o estado retornado:
    • DRAFT: é necessário comprovar a propriedade da chave privada, e a resposta inclui um verificationToken exclusivo para a Etapa 7.
    • IN_REVIEW: a prova de propriedade e a justificativa são ignoradas automaticamente (por exemplo, ao registrar um novo nome de pacote que nunca foi visto no Android ou quando você já tiver verificado a propriedade dessa chave de assinatura para outro nome de pacote no mesmo DeveloperAccount). Pule a etapa 7 e a chamada de justificativa na etapa 8 e prossiga diretamente para a sondagem de GetAndroidPackage e GetAndroidPackageKey.
  7. Crie e faça upload do APK de verificação (se o estado for DRAFT): incorpore a string verificationToken retornada em assets/adi-registration.properties dentro de um APK mínimo que corresponda a packageName, assine-o com sua chave de assinatura do app privada e faça upload dele usando POST /upload/v1/developerAccounts/{id}/androidPackages/{pkg}/keys/{sha256}:verify (VerifyAndroidPackageKeyOwnership).
  8. Envie a justificativa (se necessário) e o status do registro de pesquisa:se a chave estiver no estado OWNERSHIP_VERIFIED e registrationJustificationRequired for true, chame POST /v1/developerAccounts/{id}/androidPackages/{pkg}/keys/{sha256}:justifyAndroidPackageKeyRegistration (JustifyAndroidPackageKeyRegistration). Pesquise GetAndroidPackage e GetAndroidPackageKey até que state alcance REGISTERED.

Comandos da CLI local para preparar impressões digitais de chaves e APKs de verificação

  • Extraia a impressão digital do certificado SHA-256 de um keystore (keytool):

    keytool -list -v -keystore release-key.jks -alias my-key-alias
  • Verificar o resumo do certificado de assinatura SHA-256 em um APK criado (apksigner):

    apksigner verify --print-certs app-release.apk
  • Inspecione o nome do pacote do APK e o arquivo de token incorporado antes do upload (aapt2 e unzip):

    aapt2 dump badging app-release.apk | head -n 1
    unzip -p app-release.apk assets/adi-registration.properties

Recursos de interface e API do Android Developer Console

Tarefa Interface da Web do Android Developer Console (android.google.com/developerconsole) API Android Developer Console
Confirmação de identidade do desenvolvedor (KYC/KYB) e pagamento de taxas Compatível (pré-requisito único obrigatório) Não há suporte para o uso da API (verificação de status somente leitura usando GetDeveloperAccount e ListDeveloperAccounts)
Ver contas de desenvolvedor vinculadas Seletor de contas no cabeçalho do console GET /v1/developerAccounts (ListDeveloperAccounts)
Inspecionar chaves de assinatura históricas e a política de um nome de pacote Exibido durante o assistente "Registrar nome do pacote" GET /v1/.../registrationPolicy (GetAndroidPackageRegistrationPolicy)
Registrar um novo nome de pacote Android Nomes de pacote > Registrar nome do pacote POST /v1/{parent}/androidPackages?androidPackageId=... (CreateAndroidPackage)
Ver ou listar nomes de pacotes registrados e em rascunho Tabela do painel Nomes de pacotes GET /v1/{name} (GetAndroidPackage), GET /v1/{parent}/androidPackages (ListAndroidPackages)
Adicionar uma chave de assinatura do app e gerar um token de desafio Detalhes do pacote > Adicionar chave de assinatura POST /v1/{parent}/keys (CreateAndroidPackageKey)
Comprovar a propriedade da chave privada (adi-registration.properties) Fazer upload do APK de snippet assinado na interface do console POST /upload/v1/{name}:verify (VerifyAndroidPackageKeyOwnership)
Enviar justificativa quando a chave exigir revisão manual Comando de texto durante o fluxo de trabalho de registro de chave POST /v1/{name}:justifyAndroidPackageKeyRegistration (JustifyAndroidPackageKeyRegistration)

Configurações de serviço e autenticação

Todas as solicitações de API precisam usar HTTPS e incluir um cabeçalho Authorization: Bearer ACCESS_TOKEN recebido pelo fluxo do servidor da Web OAuth 2.0 para uma Conta do Google que tenha concluído a confirmação de identidade do desenvolvedor no Android Developer Console.

Propriedade Valor
Endpoint REST base https://androiddeveloperconsole.googleapis.com
Endpoint de upload de mídia https://androiddeveloperconsole.googleapis.com/upload
Versão da API v1
Escopo do OAuth 2.0 obrigatório https://www.googleapis.com/auth/androiddeveloperconsole
Limite de cota padrão 2,000 solicitações por dia por projeto do Google Cloud por método

Recursos e endpoints de API

A API Android Developer Console organiza os recursos na seguinte hierarquia:

  • DeveloperAccount (developerAccounts/{developer_account})
    • AndroidPackage (developerAccounts/{developer_account}/androidPackages/{android_package})
      • AndroidPackageRegistrationPolicy (developerAccounts/{developer_account}/androidPackages/{android_package}/registrationPolicy)
      • AndroidPackageKey (developerAccounts/{developer_account}/androidPackages/{android_package}/keys/{key})

Recurso: DeveloperAccount

Representa uma conta no Android Developer Console associada a uma identidade de desenvolvedor.

Campo Tipo Descrição
name string Identificador. Nome do recurso no formato developerAccounts/{developer_account}.
displayName string Apenas saída. Nome legível por humanos associado à conta de desenvolvedor (nome individual ou da organização).
verificationState enum (VerificationState) Apenas saída. Status atual da confirmação de identidade do desenvolvedor da conta.

Enum: DeveloperAccount.VerificationState

Valor Descrição
VERIFIED A confirmação de identidade do desenvolvedor foi concluída. A conta pode registrar nomes de pacotes e chaves de assinatura de apps.
NOT_VERIFIED A confirmação de identidade do desenvolvedor não foi concluída no Android Developer Console.

Métodos: DeveloperAccount

Método Solicitação HTTP Descrição
GetDeveloperAccount GET /v1/{name=developerAccounts/*} Recupera metadados e o estado de verificação de um único DeveloperAccount.
ListDeveloperAccounts GET /v1/developerAccounts Lista todos os objetos DeveloperAccount acessíveis à Conta do Google autenticada (sem paginação).

Recurso: AndroidPackage

Representa um nome de pacote Android registrado ou em processo de registro em um DeveloperAccount.

Campo Tipo Descrição
name string Identificador. Nome do recurso no formato developerAccounts/{developer_account}/androidPackages/{android_package}, em que {android_package} é o nome do pacote Android (por exemplo, com.example.myapp).
packageName string Apenas saída. O nome do pacote do Android (por exemplo, com.example.myapp).
state enum (AndroidPackage.State) Apenas saída. Estado atual do ciclo de vida do registro do nome do pacote.
registeredAppStore boolean Apenas saída. Indica se o nome do pacote está ativo como uma app store registrada.

Enumeração: AndroidPackage.State

Valor Descrição
DRAFT O recurso de nome do pacote foi criado, e o registro da chave de assinatura do app ou a verificação de propriedade ainda está em andamento.
IN_REVIEW O registro do nome do pacote e as justificativas de chave necessárias foram enviados e estão em análise pelo Google. Um pacote passa de DRAFT para IN_REVIEW imediatamente após CreateAndroidPackageKey (quando a verificação de propriedade da chave é ignorada, incluindo quando a chave já foi verificada para outro nome de pacote no mesmo DeveloperAccount) ou após concluir VerifyAndroidPackageKeyOwnership e, se necessário, JustifyAndroidPackageKeyRegistration.
REGISTERED O nome do pacote está registrado ativamente nesta conta de desenvolvedor para a verificação de desenvolvedor Android.
PENDING_TRANSFER O nome do pacote está aguardando a conclusão de uma transferência de propriedade para outra conta de desenvolvedor.

Recurso: AndroidPackageRegistrationPolicy

Recurso singleton retornado por GetAndroidPackageRegistrationPolicy que descreve as chaves de assinatura públicas históricas detectadas para um nome de pacote e se o registro do nome do pacote com uma determinada chave de assinatura requer uma justificativa por escrito.

Campo Tipo Descrição
name string Identificador. Nome do recurso no formato developerAccounts/{developer_account}/androidPackages/{android_package}/registrationPolicy.
knownKeys[] object (KnownKey) Lista de chaves de assinatura do app históricas observadas anteriormente distribuindo apps com esse nome de pacote, classificadas lexicograficamente por certificateFingerprintSha256.
knownKeys[].certificateFingerprintSha256 string Apenas saída. Impressão digital SHA-256 hexadecimal normalizada de 64 caracteres em minúsculas do certificado de assinatura histórico (sem dois-pontos).
knownKeys[].justificationRequirement enum (JustificationRequirement) Apenas saída. Indica se o registro dessa chave requer a chamada de JustifyAndroidPackageKeyRegistration (REQUIRED ou NOT_REQUIRED). Se a chave de assinatura foi verificada anteriormente em outro nome de pacote no mesmo DeveloperAccount, VerifyAndroidPackageKeyOwnership e JustifyAndroidPackageKeyRegistration serão ignorados, mesmo quando justificationRequirement for REQUIRED.
keySelectionStrategy enum (KeySelectionStrategy) Apenas saída. Política de seleção de chave para registrar este nome de pacote: SELECT_KEY_FROM_LIST (é necessário registrar uma chave de knownKeys) ou USE_ANY_KEY (qualquer chave de assinatura de app válida do desenvolvedor pode ser registrada).

Enumeração: KnownKey.JustificationRequirement

Valor Descrição
REQUIRED Para registrar essa chave conhecida, é necessário enviar uma justificativa por escrito usando JustifyAndroidPackageKeyRegistration após concluir VerifyAndroidPackageKeyOwnership (a menos que a chave tenha sido verificada anteriormente em outro nome de pacote no mesmo DeveloperAccount. Nesse caso, VerifyAndroidPackageKeyOwnership e JustifyAndroidPackageKeyRegistration são ignorados).
NOT_REQUIRED O registro dessa chave conhecida não requer uma justificativa. A chave passa diretamente para IN_REVIEW após VerifyAndroidPackageKeyOwnership (ou imediatamente após CreateAndroidPackageKey se a chave tiver sido verificada anteriormente em outro nome de pacote no mesmo DeveloperAccount).

Tipo enumerado: AndroidPackageRegistrationPolicy.KeySelectionStrategy

Valor Descrição
SELECT_KEY_FROM_LIST O autor da chamada precisa registrar uma das chaves históricas listadas em knownKeys.
USE_ANY_KEY Além das chaves em knownKeys, o autor da chamada pode registrar qualquer chave de assinatura do app válida que não tenha sido observada anteriormente no ecossistema Android.

Métodos: AndroidPackage

Método Solicitação HTTP Descrição
GetAndroidPackageRegistrationPolicy GET /v1/{name=developerAccounts/*/androidPackages/*/registrationPolicy} Recupera a estratégia de seleção de chaves e as chaves de assinatura históricas conhecidas de um nome de pacote.
CreateAndroidPackage POST /v1/{parent=developerAccounts/*}/androidPackages?androidPackageId={package_name} Cria um novo recurso AndroidPackage no estado DRAFT para começar a registrar um nome de pacote.
GetAndroidPackage GET /v1/{name=developerAccounts/*/androidPackages/*} Recupera detalhes e o estado de registro atual de um AndroidPackage.
ListAndroidPackages GET /v1/{parent=developerAccounts/*}/androidPackages Lista objetos AndroidPackage em um DeveloperAccount (pageSize máximo de 1000, pageToken).

Recurso: AndroidPackageKey

Representa uma impressão digital do certificado de assinatura de apps público associada a um AndroidPackage e rastreia o estado de verificação de propriedade e análise de registro.

Campo Tipo Descrição
name string Identificador. Nome do recurso atribuído pelo servidor no formato developerAccounts/{developer_account}/androidPackages/{android_package}/keys/{key}, em que {key} é uma impressão digital SHA-256 hexadecimal normalizada de 64 caracteres em minúsculas sem dois-pontos. Precisa ser omitido ou vazio ao chamar CreateAndroidPackageKey.
certificateFingerprintSha256 string Obrigatório. Imutável. Hash SHA-256 do certificado de assinatura de apps. Na entrada em CreateAndroidPackageKey, aceita hexadecimal simples de 64 caracteres (60e860e8...) ou hexadecimal separado por dois-pontos (60:E8:60:E8:...). Na saída, sempre normalizado para hexadecimal minúsculo de 64 caracteres sem dois-pontos.
state enum (AndroidPackageKey.State) Apenas saída. Estado atual do ciclo de vida de verificação e registro da chave.
verificationToken string Apenas saída. Token de desafio exclusivo gerado pelo Google. Usado apenas quando o estado é DRAFT (pode ser ignorado quando CreateAndroidPackageKey faz a transição da chave diretamente para IN_REVIEW). Quando o estado é DRAFT, incorpore essa string em assets/adi-registration.properties em um APK assinado para concluir VerifyAndroidPackageKeyOwnership.
registrationJustificationRequired boolean Apenas saída. Se true e a chave estiverem no estado OWNERSHIP_VERIFIED, você precisará enviar uma justificativa por escrito usando JustifyAndroidPackageKeyRegistration antes que o registro prossiga para IN_REVIEW. Se CreateAndroidPackageKey fizer a transição da chave diretamente para IN_REVIEW (porque a chave foi verificada anteriormente em outro nome de pacote no mesmo DeveloperAccount), a justificativa será ignorada.

Enumeração: AndroidPackageKey.State

Valor Descrição
DRAFT O recurso de chave foi criado, e a comprovação de posse da chave privada usando o upload do APK assinado (VerifyAndroidPackageKeyOwnership) ainda é necessária porque a propriedade dessa chave ainda não foi verificada em nenhum nome de pacote neste DeveloperAccount.
OWNERSHIP_VERIFIED A propriedade da chave privada foi verificada usando o upload de um APK assinado. Se registrationJustificationRequired for true, ainda será necessário fornecer uma justificativa antes do início da análise.
IN_REVIEW O registro da chave está em análise pelo Google. Uma chave faz a transição para cá imediatamente após CreateAndroidPackageKey quando a comprovação de propriedade não é necessária (por exemplo, em um novo nome de pacote que nunca foi visto no Android ou quando a chave foi verificada anteriormente em outro nome de pacote no mesmo DeveloperAccount, o que também pula JustifyAndroidPackageKeyRegistration), diretamente após VerifyAndroidPackageKeyOwnership (se registrationJustificationRequired for false) ou após JustifyAndroidPackageKeyRegistration (se registrationJustificationRequired for true).
REGISTERED A chave de assinatura do app está registrada ativamente nesse nome de pacote para a verificação de desenvolvedor Android.
PENDING_TRANSFER O registro da chave de assinatura do app está aguardando a conclusão de uma transferência.

Métodos: AndroidPackageKey

Método Solicitação HTTP Descrição
CreateAndroidPackageKey POST /v1/{parent=developerAccounts/*/androidPackages/*}/keys Registra uma nova impressão digital SHA-256 do certificado de assinatura de apps em um AndroidPackage. Retorna a chave no estado DRAFT (quando a comprovação de propriedade usando VerifyAndroidPackageKeyOwnership é necessária) ou diretamente no estado IN_REVIEW (quando a verificação de propriedade é ignorada, como para um novo nome de pacote que nunca foi visto no Android ou uma chave já verificada em outro nome de pacote no mesmo DeveloperAccount).
GetAndroidPackageKey GET /v1/{name=developerAccounts/*/androidPackages/*/keys/*} Recupera o status, a impressão digital e os metadados de verificação de um AndroidPackageKey específico.
ListAndroidPackageKeys GET /v1/{parent=developerAccounts/*/androidPackages/*}/keys Lista todos os objetos AndroidPackageKey registrados em um AndroidPackage (pageSize máximo 1000, pageToken).
VerifyAndroidPackageKeyOwnership POST /upload/v1/{name=developerAccounts/*/androidPackages/*/keys/*}:verify Faz upload de um APK mínimo assinado que contém verificationToken em assets/adi-registration.properties para verificar a propriedade da chave privada e enviar as chaves prontas para revisão.
JustifyAndroidPackageKeyRegistration POST /v1/{name=developerAccounts/*/androidPackages/*/keys/*}:justifyAndroidPackageKeyRegistration Envia mais contexto de justificativa quando registrationJustificationRequired é true e envia chaves verificadas para análise.

Tratamento de erros

Quando uma solicitação de API falha, a API Android Developer Console retorna um código de status HTTP 4xx ou 5xx e um corpo de erro JSON google.rpc.Status padrão:

{
  "error": {
    "code": 400,
    "message": "Invalid certificate fingerprint SHA256 format.",
    "status": "INVALID_ARGUMENT",
    "details": []
  }
}

Códigos de status HTTP e soluções comuns

Código HTTP Status do gRPC Causas comuns Resolução
400 Bad Request INVALID_ARGUMENT androidPackageId no estilo Java ausente ou inválido; formato certificateFingerprintSha256 inválido; campo name não vazio em CreateAndroidPackage ou CreateAndroidPackageKey; o APK enviado não está assinado, está corrompido, não tem assets/adi-registration.properties, não tem verificationToken correspondente ou está assinado com um certificado incompatível. Valide os formatos de solicitação em relação aos esquemas de recursos, omita ou esvazie name nas chamadas de criação e verifique a assinatura do APK e o token incorporado usando apksigner verify --print-certs e unzip -p app-release.apk assets/adi-registration.properties antes de fazer o upload.
400 Bad Request FAILED_PRECONDITION DeveloperAccount tem verificationState: NOT_VERIFIED; a seleção de chave viola AndroidPackageRegistrationPolicy (SELECT_KEY_FROM_LIST); chamada de VerifyAndroidPackageKeyOwnership ou JustifyAndroidPackageKeyRegistration em um estado não qualificado. Conclua a confirmação de identidade do desenvolvedor no Android Developer Console, verifique primeiro o GetAndroidPackageRegistrationPolicy e inspecione o state atual do recurso.
401 Unauthorized UNAUTHENTICATED Token de acesso do portador do OAuth 2.0 ausente, expirado ou inválido, ou tentativa de autenticação usando uma chave de API ou conta de serviço. Consiga um novo token de acesso do portador do OAuth 2.0 delegado pelo usuário com o escopo https://www.googleapis.com/auth/androiddeveloperconsole.
403 Forbidden PERMISSION_DENIED O usuário autenticado não tem permissão no DeveloperAccount ou AndroidPackage de destino, ou a API Android Developer Console não está ativada no projeto na nuvem do Google Cloud. Verifique a associação da conta usando ListDeveloperAccounts e confira se androiddeveloperconsole.googleapis.com está ativado no console do Google Cloud.
404 Not Found NOT_FOUND O caminho do recurso DeveloperAccount, AndroidPackage ou AndroidPackageKey especificado não existe. Confirme os caminhos de recursos usando ListDeveloperAccounts, ListAndroidPackages ou ListAndroidPackageKeys. Verifique se os IDs de {key} usam hexadecimal em minúsculas sem dois-pontos.
409 Conflict ALREADY_EXISTS O nome do pacote ou a impressão digital do certificado SHA-256 já está registrado nesta ou em outra conta de desenvolvedor. Inspecione os registros atuais usando GetAndroidPackage ou GetAndroidPackageKey ou verifique o histórico de propriedade usando GetAndroidPackageRegistrationPolicy.
429 Too Many Requests RESOURCE_EXHAUSTED A cota por método de 2,000 solicitações por dia por projeto do Google Cloud foi excedida. Implemente a espera exponencial com instabilidade e evite loops de sondagem de alta frequência.
500 / 503 INTERNAL / UNAVAILABLE Erro temporário de back-end ou indisponibilidade temporária do serviço. Tente novamente as solicitações idempotentes com espera exponencial truncada.

Exemplos de solicitação e resposta HTTP

Substitua os valores de marcador, como ACCESS_TOKEN, 1234567890, com.example.myapp e 60e860e8..., pelos seus próprios valores.

1. GetDeveloperAccount

curl -X GET \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  "https://androiddeveloperconsole.googleapis.com/v1/developerAccounts/1234567890"

Resposta:

{
  "name": "developerAccounts/1234567890",
  "displayName": "Example Developer",
  "verificationState": "VERIFIED"
}

2. ListDeveloperAccounts

curl -X GET \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  "https://androiddeveloperconsole.googleapis.com/v1/developerAccounts"

Resposta:

{
  "developerAccounts": [
    {
      "name": "developerAccounts/1234567890",
      "displayName": "Example Developer",
      "verificationState": "VERIFIED"
    }
  ]
}

3. GetAndroidPackageRegistrationPolicy

curl -X GET \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  "https://androiddeveloperconsole.googleapis.com/v1/developerAccounts/1234567890/androidPackages/com.example.myapp/registrationPolicy"

Resposta:

{
  "name": "developerAccounts/1234567890/androidPackages/com.example.myapp/registrationPolicy",
  "knownKeys": [
    {
      "certificateFingerprintSha256": "60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
      "justificationRequirement": "NOT_REQUIRED"
    }
  ],
  "keySelectionStrategy": "SELECT_KEY_FROM_LIST"
}

4. CreateAndroidPackage

curl -X POST \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  -H "Content-Type: application/json; charset=utf-8" \
  -d '{"name": ""}' \
  "https://androiddeveloperconsole.googleapis.com/v1/developerAccounts/1234567890/androidPackages?androidPackageId=com.example.myapp"

Resposta:

{
  "name": "developerAccounts/1234567890/androidPackages/com.example.myapp",
  "packageName": "com.example.myapp",
  "state": "DRAFT",
  "registeredAppStore": false
}

5. GetAndroidPackage

curl -X GET \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  "https://androiddeveloperconsole.googleapis.com/v1/developerAccounts/1234567890/androidPackages/com.example.myapp"

Resposta:

{
  "name": "developerAccounts/1234567890/androidPackages/com.example.myapp",
  "packageName": "com.example.myapp",
  "state": "REGISTERED",
  "registeredAppStore": false
}

6. ListAndroidPackages

curl -X GET \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  "https://androiddeveloperconsole.googleapis.com/v1/developerAccounts/1234567890/androidPackages?pageSize=100"

Resposta:

{
  "androidPackages": [
    {
      "name": "developerAccounts/1234567890/androidPackages/com.example.myapp",
      "packageName": "com.example.myapp",
      "state": "REGISTERED",
      "registeredAppStore": false
    }
  ],
  "nextPageToken": ""
}

7. CreateAndroidPackageKey

curl -X POST \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  -H "Content-Type: application/json; charset=utf-8" \
  -d '{
    "certificateFingerprintSha256": "60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123"
  }' \
  "https://androiddeveloperconsole.googleapis.com/v1/developerAccounts/1234567890/androidPackages/com.example.myapp/keys"

Resposta:

{
  "name": "developerAccounts/1234567890/androidPackages/com.example.myapp/keys/60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
  "certificateFingerprintSha256": "60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
  "state": "DRAFT",
  "verificationToken": "token_xyz987654321"
}

8. GetAndroidPackageKey

curl -X GET \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  "https://androiddeveloperconsole.googleapis.com/v1/developerAccounts/1234567890/androidPackages/com.example.myapp/keys/60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123"

Resposta:

{
  "name": "developerAccounts/1234567890/androidPackages/com.example.myapp/keys/60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
  "certificateFingerprintSha256": "60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
  "state": "REGISTERED"
}

9. ListAndroidPackageKeys

curl -X GET \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  "https://androiddeveloperconsole.googleapis.com/v1/developerAccounts/1234567890/androidPackages/com.example.myapp/keys?pageSize=100"

Resposta:

{
  "androidPackageKeys": [
    {
      "name": "developerAccounts/1234567890/androidPackages/com.example.myapp/keys/60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
      "certificateFingerprintSha256": "60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
      "state": "REGISTERED"
    }
  ],
  "nextPageToken": ""
}

10. VerifyAndroidPackageKeyOwnership

Opção A: upload de mídia de solicitação única

curl -X POST \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  -H "Content-Type: application/octet-stream" \
  --data-binary @app-release.apk \
  "https://androiddeveloperconsole.googleapis.com/upload/v1/developerAccounts/1234567890/androidPackages/com.example.myapp/keys/60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123:verify?uploadType=media"

Opção B: protocolo de upload retomável (recomendado para APKs grandes ou CI/CD)

Etapa 1: iniciar a sessão de upload retomável e extrair o cabeçalho X-Goog-Upload-URL retornado:

curl -i -X POST \
  "https://androiddeveloperconsole.googleapis.com/upload/v1/developerAccounts/1234567890/androidPackages/com.example.myapp/keys/60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123:verify" \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  -H "X-Goog-Upload-Protocol: resumable" \
  -H "X-Goog-Upload-Command: start" \
  -H "X-Goog-Upload-Header-Content-Length: FILE_SIZE_IN_BYTES" \
  -H "X-Goog-Upload-Header-Content-Type: application/vnd.android.package-archive" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "developerAccounts/1234567890/androidPackages/com.example.myapp/keys/60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123"
  }'

Etapa 2: faça upload do binário do APK assinado para UPLOAD_SESSION_URI e finalize a sessão:

curl -X PUT \
  "UPLOAD_SESSION_URI" \
  -H "Content-Length: FILE_SIZE_IN_BYTES" \
  -H "X-Goog-Upload-Offset: 0" \
  -H "X-Goog-Upload-Command: upload, finalize" \
  --data-binary "@app-release.apk"

Resposta:

{
  "name": "developerAccounts/1234567890/androidPackages/com.example.myapp/keys/60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
  "certificateFingerprintSha256": "60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
  "state": "IN_REVIEW"
}

11. JustifyAndroidPackageKeyRegistration

curl -X POST \
  -H "Authorization: Bearer ACCESS_TOKEN" \
  -H "Content-Type: application/json; charset=utf-8" \
  -d '{
    "justification": "We previously distributed com.example.myapp directly from https://downloads.example.com and are migrating to our rotated production key."
  }' \
  "https://androiddeveloperconsole.googleapis.com/v1/developerAccounts/1234567890/androidPackages/com.example.myapp/keys/60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123:justifyAndroidPackageKeyRegistration"

Resposta:

{
  "name": "developerAccounts/1234567890/androidPackages/com.example.myapp/keys/60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
  "certificateFingerprintSha256": "60e860e8d77251234567890abcdef1234567890abcdef1234567890abcdef123",
  "state": "IN_REVIEW",
  "registrationJustificationRequired": true
}

Outros recursos