> ## Documentation Index
> Fetch the complete documentation index at: https://docs.switchport.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Authentication

> Authenticate with the Switchport API using your API key

## Get Your API Key

<Steps>
  <Step title="Sign in to Switchport">
    Go to [switchport.ai](https://switchport.ai) and log in to your account.
  </Step>

  <Step title="Navigate to API Keys">
    Go to **Settings** → **API Keys** in the dashboard.
  </Step>

  <Step title="Copy your API key">
    Copy your API key. It should start with `sp_`.
  </Step>
</Steps>

## Set Your API Key

There are two ways to authenticate with the Switchport API:

### Option 1: Environment Variable (Recommended)

Set the `SWITCHPORT_API_KEY` environment variable:

<CodeGroup>
  ```bash Linux/Mac theme={null}
  export SWITCHPORT_API_KEY=sp_your_key_here
  ```

  ```powershell Windows (PowerShell) theme={null}
  $env:SWITCHPORT_API_KEY="sp_your_key_here"
  ```

  ```bash .env file theme={null}
  SWITCHPORT_API_KEY=sp_your_key_here
  ```
</CodeGroup>

Then initialize the client without passing the API key:

```python theme={null}
from switchport import Switchport

client = Switchport()  # Automatically reads from environment
```

### Option 2: Pass API Key Directly

Pass the API key when creating the client:

```python theme={null}
from switchport import Switchport

client = Switchport(api_key="sp_your_key_here")
```

<Warning>
  Never hard-code API keys in your source code. Use environment variables or a secrets management system instead.
</Warning>

## Using .env Files

For local development, you can use a `.env` file with a library like `python-dotenv`:

1. Install python-dotenv:

```bash theme={null}
pip install python-dotenv
```

2. Create a `.env` file in your project root:

```bash theme={null}
SWITCHPORT_API_KEY=sp_your_key_here
```

3. Load the environment variables in your code:

```python theme={null}
from dotenv import load_dotenv
from switchport import Switchport

load_dotenv()  # Load .env file

client = Switchport()  # Reads from environment
```

<Note>
  Add `.env` to your `.gitignore` file to avoid committing secrets to version control.
</Note>

## Configure API URL (Optional)

By default, the SDK connects to `https://switchport-api.vercel.app`. For local development or self-hosted instances, you can override this:

### Using Environment Variable

```bash theme={null}
export SWITCHPORT_API_URL=http://localhost:8001
```

### Passing to Client

```python theme={null}
client = Switchport(
    api_key="sp_your_key_here",
    api_url="http://localhost:8001"
)
```

## Error Handling

If authentication fails, the SDK raises an `AuthenticationError`:

```python theme={null}
from switchport import Switchport, AuthenticationError

try:
    client = Switchport()
    response = client.prompts.execute("my-prompt")
except AuthenticationError as e:
    print(f"Authentication failed: {e}")
    # Handle error (e.g., prompt user to check API key)
```

Common authentication errors:

* **Invalid API key**: The API key is incorrect or has been revoked
* **Missing API key**: No API key provided and `SWITCHPORT_API_KEY` is not set
* **Expired API key**: The API key has expired (contact support)

## Security Best Practices

<AccordionGroup>
  <Accordion title="Use environment variables">
    Store API keys in environment variables, not in source code.
  </Accordion>

  <Accordion title="Rotate keys regularly">
    Regularly rotate API keys to minimize risk if a key is compromised.
  </Accordion>

  <Accordion title="Use different keys for different environments">
    Use separate API keys for development, staging, and production.
  </Accordion>

  <Accordion title="Restrict key permissions">
    If available, use API keys with limited permissions for specific use cases.
  </Accordion>

  <Accordion title="Never commit secrets">
    Add `.env` and secrets files to `.gitignore`.
  </Accordion>
</AccordionGroup>

## Next Steps

<Card title="Execute Prompts" icon="code" href="/sdk/python/prompts">
  Learn how to execute prompts with the SDK
</Card>
