> For the complete documentation index, see [llms.txt](https://cortex-docs.paloaltonetworks.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://cortex-docs.paloaltonetworks.com/cortex-xpanse/integrations/generate-an-api-key.md).

# Generate an API Key

Before you can begin using Cortex Xpanse Expander API, you must generate an API Key and collect the API Key ID and FQDN from Expander.

| Value          | Description                                                                                                                                                                                                                                                                      |
| -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **API Key**    | <p>The API Key is your unique identifier used as the "<code>Authorization:{key}</code>" header required for authenticating API calls.</p><p>Depending on your desired security level, you can generate two types of API keys, \*\*Advanced \*\*or <strong>Standard</strong>.</p> |
| **API Key ID** | The API Key ID is your unique token used to authenticate the API Key. The header used when running an API call is "`x-xdr-auth-id:{key_id}`".                                                                                                                                    |
| **FQDN**       | The FQDN is a unique host and domain name associated with each tenant. When you generate the API Key and Key ID, you are assigned an individual FQDN.                                                                                                                            |

Expander API URIs are made up of your unique FQDN, the API name, and name of call. For example, `https://api-{fqdn}/public_api/v1/{name of api}/{name of call}/`.

The following steps describe how to generate the necessary key values.

1. Generate a new Expander API Key.
   1. In Expander, navigate to **Settings** → **Configurations** → **Integrations** → **API Keys**.
   2. Select **+ New Key**.
   3. Select the **User Roles** tab, and choose the type of API Key you want to generate based on your desired security level: \*\*Advanced \*\*or **Standard**.

      The Advanced API key hashes the key using a nonce, a random string, and a timestamp to prevent replay attacks. cURL does not support this but is suitable with scripts. Use the provided script to create the advanced API authentication token.

      <div data-gb-custom-block data-tag="hint" data-style="info" class="hint hint-info"><h3>Note</h3><p>To integrate with Cortex XSOAR, you must generate a <strong>Standard</strong> Key.</p></div>
   4. If you want to define a time limit on the API key authentication, check **Enable Expiration Date** and select the expiration date and time.

      Navigate to **Settings** → **Configurations** → **Integrations** → **API Keys** to view the **Expiration Time** field for each API key. In addition, Expander displays a API Key Expiration notification in the Notification Center one week and one day prior to the defined expiration date.
   5. Select a **Role** to specify the desired level of access for this key.

      You can view the permissions for each role by expanding the **Components** on the lower part of the page. The list of available roles will match the roles defined on the **Settings** → **Configurations** → **Access Management** → **Roles** page.
   6. Optionally, enter a **Comment** that describes the purpose of the API key.
   7. Click **Save** to generate the API key.
   8. Copy the **Generated Key**, and then click **Close**.

      <div data-gb-custom-block data-tag="hint" data-style="warning" class="hint hint-warning"><h3>Caution</h3><p>You will not be able to view the API Key again after you complete this step, so ensure that you copy it before closing the <strong>Generated Key</strong> notification.</p></div>
2. Get your Expander API Key ID.
   1. In the **API Keys** table, locate the **ID** field.
   2. Note your corresponding \*\*ID \*\*number. This value represents the `x-xdr-auth-id:{key_id}` token.
3. Get you FQDN.
   1. Right-click your API key and select **View Examples**.
   2. Copy the

      **CURL Example** URL. The example contains your unique FQDN:

      `https://api-{fqdn}/public_api/v1/{name of api}/{name of call}/`
4. Make your first API call.

   The following examples vary depending on the type of key you select.

   You can test authentication with Advanced API keys using the provided Python 3 example. With Standard API keys, use either the cURL example or the Python 3 example. Don’t forget to replace the example variables with your unique API key, API key ID, and FQDN tenant ID.

   After you verify authentication, you can begin making API calls.

   **Standard Key cURL Example**

   ```programlisting
   curl -X POST https://api-{fqdn}/public_api/v1/{name of api}/{name of call}/ 
   -H "x-xdr-auth-id:{key_id}"
   -H "Authorization:{key}"
   -H "Content-Type:application/json" 
   -d '{}'
   ```

   **Standard Key Python 3 Example**

   ```programlisting
   import requests
       def test_standard_authentication(api_key_id, api_key):
       headers = {
           "x-xdr-auth-id": str(api_key_id),
           "Authorization": api_key
       }
       parameters = {}
       res = requests.post(url="https://api-{fqdn}/public_api/v1/{name of api}/{name of call}",
                           headers=headers,
                           json=parameters)
       return res
   ```

   **Advanced Key Python 3 Example**

   ```programlisting
   import requests

   from datetime import datetime, timezone
   import secrets
   import string
   import hashlib
   import requests

   def test_advanced_authentication(api_key_id, api_key):
      # Generate a 64 bytes random string
       nonce = "".join([secrets.choice(string.ascii_letters + string.digits) for _ in range(64)])
       # Get the current timestamp as milliseconds.
       timestamp = int(datetime.now(timezone.utc).timestamp()) * 1000
       # Generate the auth key:
       auth_key = "%s%s%s" % (api_key, nonce, timestamp)
       # Convert to bytes object
       auth_key = auth_key.encode("utf-8")
       # Calculate sha256:
       api_key_hash = hashlib.sha256(auth_key).hexdigest()
       # Generate HTTP call headers
       headers = {
           "x-xdr-timestamp": str(timestamp),
           "x-xdr-nonce": nonce,
           "x-xdr-auth-id": str(api_key_id),
           "Authorization": api_key_hash
       }
       parameters = {}
       res = requests.post(url="https://api-{fqdn}/public_api/v1/{name of api}/{name of call}",
                           headers=headers,
                           json=parameters)
       return res
   ```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://cortex-docs.paloaltonetworks.com/cortex-xpanse/integrations/generate-an-api-key.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
