Filter syntax

This page explains the syntax you must use to filter accounts.

Syntax

All values other than integers must be enclosed in double quotes ("). To learn what values a specific field accepts, see the reference documentation for that field.

You can use AND to filter for multiple fields in the same query. You can also use AND to combine multiple relationship(...) and service(...) filters. Here's an example that combines multiple relationship(...) and service(...) filters:

(relationship(service(type = "ACCOUNT_MANAGEMENT") AND service(handshakeState = "PENDING"))) OR (accountName = "store" AND relationship(...))

This example returns the following accounts:

  • All accounts with an account management relationship to another account, and an additional relationship that's pending acceptance.

  • All accounts with the display name "store", who have relationships to other accounts.

You can't use AND to filter for multiple values in the same field. For example, you can't use accountName = "*A*" AND accountName = "*B*".

You can use OR to filter for two fields in the same query. Enclose the filter criteria on each side of the OR operator with parentheses. For example, (accountName = "storeA") OR (accountName = "storeB").

You can only use OR to combine two fields. For example, you can't use (accountName = "storeA") OR (accountName = "storeB") OR (accountName = "storeC").

Parentheses aren't allowed other than with the AND and OR operators, and in function invocations, like relationship(...) and service(...).

For string fields like accountName and accountIdAlias, you can filter for values that contain a certain word or sequence of characters by enclosing the sequence in asterisks (*). For example, accountName = "*foo*" returns all accounts with an accountName containing foo, like "storeFoo".

You can filter for values that don't contain a certain sequence by using != and *. For example, accountName != "*foo*" returns all accounts with an accountName that doesn't contain foo.

Extra white spaces are ignored. For example, foo AND bar is the same as foo AND bar.

Here are a few examples of filtering accounts using the account.list method:

"* All MCA sub-accounts containing "Store"

accountName = "*store*" AND relationship(service(type = "ACCOUNT_AGGREGATION"))
  • All accounts that are managed by provider 123456
relationship(service(type = "ACCOUNT_MANAGEMENT") AND providerId = 123456)
  • All accounts that have sent an invitation to provider 123456 or need to accept an invitation from this provider
relationship(service(handshakeState = "PENDING" AND type ="ACCOUNT_MANAGEMENT")
AND providerId = 123456)

To filter for the accounts the user making the request can access, use the google.shopping.merchant.accounts.v1beta.ListAccountsRequest method, as shown in the following sample.

Java

import com.google.api.gax.core.FixedCredentialsProvider;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.shopping.merchant.accounts.v1beta.Account;
import com.google.shopping.merchant.accounts.v1beta.AccountsServiceClient;
import com.google.shopping.merchant.accounts.v1beta.AccountsServiceClient.ListAccountsPagedResponse;
import com.google.shopping.merchant.accounts.v1beta.AccountsServiceSettings;
import com.google.shopping.merchant.accounts.v1beta.ListAccountsRequest;
import shopping.merchant.samples.utils.Authenticator;
import shopping.merchant.samples.utils.Config;

/** This class demonstrates how to filter the accounts the user making the request has access to. */
public class FilterAccountsSample {

  public static void filterAccounts(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.
    AccountsServiceSettings accountsServiceSettings =
        AccountsServiceSettings.newBuilder()
            .setCredentialsProvider(FixedCredentialsProvider.create(credential))
            .build();

    // Calls the API and catches and prints any network failures/errors.
    try (AccountsServiceClient accountsServiceClient =
        AccountsServiceClient.create(accountsServiceSettings)) {

      // Filter for accounts with display names containing "store" and a provider with the ID "123":
      String filter = "accountName = \"*store*\" AND relationship(providerId = 123)";

      // Filter for all subaccounts of account "123":
      // String filter2 = "relationship(providerId = 123 AND service(type =
      // \"ACCOUNT_AGGREGATION\"))";

      // String filter3 = "relationship(service(handshakeState = \"APPROVED\" AND type =
      // \"ACCOUNT_MANAGEMENT\") AND providerId = 123)";

      ListAccountsRequest request = ListAccountsRequest.newBuilder().setFilter(filter).build();

      System.out.println("Sending list accounts request with filter:");
      ListAccountsPagedResponse response = accountsServiceClient.listAccounts(request);

      int count = 0;

      // Iterates over all rows in all pages and prints the sub-account
      // in each row.
      // `response.iterateAll()` automatically uses the `nextPageToken` and recalls the
      // request to fetch all pages of data.
      for (Account account : response.iterateAll()) {
        System.out.println(account);
        count++;
      }
      System.out.print("The following count of elements were returned: ");
      System.out.println(count);
    } catch (Exception e) {
      System.out.println(e);
    }
  }

  public static void main(String[] args) throws Exception {
    Config config = Config.load();

    filterAccounts(config);
  }
}

Specification

The filters follow a subset of the AIP filter specification, and its formal EBNF grammar:

filter
    : accountFilterDisj
    | accountFilterConj

accountFilterDisj
    : "(" accountFilterConj " OR " accountFilterConj ")"
    ;
accountFilterConj
    : accountFilter {" AND " accountFilter}
    ;

accountFilter
    : accountNameFilter | capabilityFilter | relationshipFn
    ;

accountNameFilter
    : "accountName" comparator value
    ;

capabilityFilter
    : "capabilities:" capabilityValue
    | "-capabilities:" capabilityValue
    | "NOT capabilities:" capabilityValue
    ;
capabilityValue
    : "CAN_UPLOAD_PRODUCTS"
    ;

relationshipFn
    : "relationship(" relationshipConj ")"
    ;
relationshipConj
    : relationshipFilter {" AND " relationshipFilter}
    ;
relationshipFilter
    : "providerId = " numValue
    | "accountIdAlias" comparator value
    | serviceFn
    ;

serviceFn
    : "service(" serviceConj ")"
    ;
serviceConj
    : serviceFilter {" AND " serviceFilter}
    ;
serviceFilter
    : "externalAccountId" comparator value
    | "handshakeState = " handshakeState
    | "type = " serviceType
    ;

handshakeState
    : "PENDING"
    | "APPROVED"
    | "REJECTED"
    ;
serviceType
    : "ACCOUNT_AGGREGATION"
    | "ACCOUNT_MANAGEMENT"
    ;

comparator
    : " = " | " != "
    ;