| # API Keys | 
 |  | 
 | When using a custom build, fork, or integration of Chromium, or if you're | 
 | building ChromiumOS, you will need access to Google API for key functionality. | 
 |  | 
 | [TOC] | 
 |  | 
 | *** note | 
 | **Note:** Software distribution with keys acquired for yourself is allowed, but | 
 | the keys themselves cannot be shared with parties outside the legal entity that | 
 | accepted the API ToS.  Keep in mind that a number of the APIs will have no or | 
 | very limited quota and not all of the APIs have additional quota available for | 
 | purchase. | 
 | *** | 
 |  | 
 | **Googlers only:** | 
 |  | 
 | *   For a simpler approach to API keys, see http://go/chrome-api-key-setup | 
 | *   If you need a new API enabled in Chrome, use http://b/new?component=165132 | 
 |  | 
 | **How-to:** | 
 | First, acquire API keys. Then, specify the API keys to use either when you build | 
 | Chromium, or at runtime using environment variables. | 
 |  | 
 | ## Acquiring Keys | 
 |  | 
 | 1.  Make sure you are a member of chromium-dev@chromium.org (you can choose | 
 |     not to receive mail). | 
 |     *** note | 
 |     **Note:** the APIs below are only visible to people subscribed to that group. | 
 |     *** | 
 | 1.  Make sure you are logged in with the Google account associated with the email | 
 |     address that you used to subscribe to chromium-dev. | 
 | 1.  Go to https://cloud.google.com/console | 
 | 1.  _optional_  You may add other members of your organization or team on the Team | 
 |     tab. | 
 | 1.  Open the **APIs and Services > Library** from the hamburger menu, search for | 
 |     all of the following APIs. For each of these APIs: | 
 |     1.  Click on it | 
 |     1.  Click `Enable API` button at the top | 
 |     1.  Read and agree to the Terms of Service | 
 |     1.  Check the `I have read and agree to the <API name> Terms of Service` | 
 |         checkbox | 
 |     1.  Click Accept. | 
 |  | 
 |     **List of APIs** (if any are not shown, recheck step 1 above): | 
 |  | 
 |     *   Cloud Search API | 
 |     *   Geolocation API (requires [enabling | 
 |         billing](https://developers.google.com/console/help/#EnableBilling) but | 
 |         is free to use; you can skip this one, in which case geolocation features | 
 |         of Chrome will not work) | 
 |     *   Google Drive API (enable this for Files.app on Chrome OS and | 
 |         SyncFileSystem API) | 
 |     *   Safe Browsing API (Googlers should additionally reach out to the Safe | 
 |         Browsing team to ensure that visibility labels are applied | 
 |         appropriately) | 
 |     *   Time Zone API | 
 |     *   Optional | 
 |         *   Admin SDK | 
 |         *   Cloud Translation API | 
 |         *   Geocoding API | 
 |         *   Google Assistant API | 
 |         *   Google Calendar API | 
 |         *   Nearby Messages API | 
 |  | 
 | 1.  Go to the **Credentials** sub tab under the **API & Services** section in the | 
 |     hamburger menu. | 
 | 1.  Click the `Create credentials` button then click on the **OAuth client | 
 |     ID** item in the drop-down list. | 
 |     *   Click on the `Configure consent screen` button. Fill in the "product | 
 |         name" (anything you choose) and other details, then click on `Save`. | 
 |     *   Return to the Credentials tab and click the `Add credentials` button | 
 |         again, then select "OAuth 2.0 client ID" from the drop-down list. | 
 |     *   In the "Application type" section check the **Other** option and give it a | 
 |         name in the "Name" text box, then click `Create`. | 
 | 1.  In the pop-up window that appears, you'll see a **client ID** and a **Client | 
 |     secret** string. Copy and paste those in a text file on your dev box then | 
 |     click `OK` to dismiss. A new item should now appear in the **OAuth 2.0 client | 
 |     IDs** list. You can click on the name of your client ID to retrieve the ID and | 
 |     secret at any time. In the next few sections, these values will be referred | 
 |     to as the **Client ID** and **Client secret** fields. | 
 | 1.  Click the `Create credentials` button _again_ on the same page. | 
 |     *   In the pop-over window that shows up, click the `API key` button. | 
 |     *   A pop-over should show up giving you the API key. Copy/paste in to a text | 
 |         file to save, although you will be able to access this as well. | 
 |     *   Click `OK` to dismiss. | 
 |  | 
 | You should now have an API key and an OAuth 2.0 client ID in the **Credentials** | 
 | tab. The next sections will refer to the value as the "API key". | 
 |  | 
 | *** note | 
 | **Note:** Your keys are not for distribution, and should not be shared with | 
 | others. | 
 | *** | 
 |  | 
 | ## Providing Keys at Build time | 
 |  | 
 | If you are building Chromium yourself, you can provide keys as part of your | 
 | build configuration, that way they are always baked into your binary. | 
 |  | 
 | Specify three variables in your `args.gn` file (edit by running `gn args | 
 | out/your_out_dir_here`) | 
 |  | 
 | ```bash | 
 | google_api_key = "your_api_key" | 
 | google_default_client_id = "your_client_id" | 
 | google_default_client_secret = "your_client_secret" | 
 | ``` | 
 |  | 
 | ## Providing Keys at Runtime | 
 |  | 
 | If you prefer, you can build a Chromium binary (or use a pre-built Chromium | 
 | binary) without API keys baked in, and instead provide them at runtime. To do | 
 | so, set the environment variables `GOOGLE_API_KEY`, `GOOGLE_DEFAULT_CLIENT_ID` | 
 | and `GOOGLE_DEFAULT_CLIENT_SECRET` to your "API key", "Client ID" and "Client | 
 | secret" values respectively. | 
 |  | 
 | On Chromium OS to specify the keys as environment variables append them to the | 
 | end of `/etc/chrome_dev.conf`: | 
 |  | 
 | ```bash | 
 | GOOGLE_API_KEY=your_api_key | 
 | GOOGLE_DEFAULT_CLIENT_ID=your_client_id | 
 | GOOGLE_DEFAULT_CLIENT_SECRET=your_client_secret | 
 | ``` | 
 |  | 
 | ## Signing in to Chromium is restricted | 
 |  | 
 | Signing in to Chromium requires an OAuth 2.0 token for authentication. As this | 
 | OAuth 2.0 token gives access to various Google services that handle user data | 
 | (e.g. Chrome sync), for security and privacy reasons the generation of this | 
 | OAuth 2.0 token is restricted. This means that signing in to Chromium is | 
 | restricted (as the OAuth 2.0 token cannot be generated). In order to sign in to | 
 | Chromium builds, please add your test account to | 
 | google-browser-signin-testaccounts@chromium.org (accounts in this group are | 
 | allowed to get access tokens bypassing the restriction above). | 
 |  | 
 | *** note | 
 | **Note:** Starting with Chromium M69, when the browser is set up with an OAuth | 
 | 2.0 client ID and client secret, signing in with your Google Account to any | 
 | Google web property will also attempt to sign you in to Chromium (which will | 
 | fail as explained above). To avoid such errors, remove your OAuth 2.0 client | 
 | ID and client secret from your build to stop generating tokens when users sign | 
 | in to Google web properties (remove `google_default_client_id`, | 
 | `google_default_client_secret` from gn args and `GOOGLE_DEFAULT_CLIENT_ID` | 
 | and `GOOGLE_DEFAULT_CLIENT_SECRET` from your environment settings). | 
 | *** | 
 |  | 
 | ## Getting Keys for Your Chromium Derivative | 
 |  | 
 | Many of the Google APIs used by Chrome are specific to Google and not intended | 
 | for use in derived products. In the [API Console](http://developers.google.com/console) | 
 | you may be able to purchase additional quota for some of the APIs listed above. | 
 | **For APIs that do not have a "Pricing" link, additional quota is not available | 
 | for purchase.** | 
 |  | 
 | ## Polyfilling chrome.identity API in Your Chromium Derivative | 
 |  | 
 | The default Chromium `chrome.identity.getAuthToken` API that extensions may | 
 | call to obtain auth tokens will fail outside of Google Chrome as the | 
 | implementation uses restricted APIs. | 
 |  | 
 | A prototype CL for Chromium embedders might use to replace the implementation | 
 | with one not dependent upon private APIs can be found attached to | 
 | [this post](https://groups.google.com/a/chromium.org/g/embedder-dev/c/tGCJ3QNVzYE). |