---
title: API Setup & Configuration
---

This guide covers the essential setup for using Stack Auth's REST API in your Python application. Stack Auth provides a REST API for managing users, sessions, and authentication flows.

## Prerequisites

Before you begin, make sure you have:
- A Stack Auth [project](https://app.stack-auth.com/projects) created
- Python 3.7+ installed
- `requests` library (`pip install requests`)

## Environment Configuration

First, set up your API credentials. Get these from your Stack Auth dashboard:

```bash
# .env file
STACK_PROJECT_ID=your_project_id
STACK_PUBLISHABLE_KEY=your_publishable_key
STACK_SECRET_KEY=your_secret_key
STACK_API_URL=https://api.stack-auth.com
```

## Basic API Client Setup

Create a basic API client to handle Stack Auth requests:

```python
import os
import requests
from typing import Dict, Any, Optional

class StackAuthClient:
    def __init__(self):
        self.project_id = os.getenv('STACK_PROJECT_ID')
        self.secret_key = os.getenv('STACK_SECRET_KEY')
        self.publishable_key = os.getenv('STACK_PUBLISHABLE_KEY')
        self.api_url = os.getenv('STACK_API_URL', 'https://api.stack-auth.com')
        
        if not all([self.project_id, self.secret_key]):
            raise ValueError("Missing required Stack Auth credentials")
    
    def _make_request(
        self, 
        method: str, 
        endpoint: str, 
        data: Optional[Dict[str, Any]] = None,
        headers: Optional[Dict[str, str]] = None
    ) -> requests.Response:
        """Make authenticated request to Stack Auth API"""
        url = f"{self.api_url}/api/v1{endpoint}"
        
        # Add authentication headers
        auth_headers = {
            'X-Stack-Project-Id': self.project_id,
            'X-Stack-Secret-Key': self.secret_key,
            'Content-Type': 'application/json'
        }
        
        if headers:
            auth_headers.update(headers)
        
        response = requests.request(
            method=method,
            url=url,
            json=data,
            headers=auth_headers
        )
        
        # Handle common error cases
        if response.status_code == 401:
            raise Exception("Authentication failed - check your API credentials")
        elif response.status_code == 403:
            raise Exception("Forbidden - insufficient permissions")
        elif not response.ok:
            raise Exception(f"API request failed: {response.status_code} - {response.text}")
        
        return response
    
    def get(self, endpoint: str, **kwargs) -> requests.Response:
        return self._make_request('GET', endpoint, **kwargs)
    
    def post(self, endpoint: str, data: Dict[str, Any] = None, **kwargs) -> requests.Response:
        return self._make_request('POST', endpoint, data, **kwargs)
    
    def put(self, endpoint: str, data: Dict[str, Any] = None, **kwargs) -> requests.Response:
        return self._make_request('PUT', endpoint, data, **kwargs)
    
    def delete(self, endpoint: str, **kwargs) -> requests.Response:
        return self._make_request('DELETE', endpoint, **kwargs)

# Initialize the client
stack_client = StackAuthClient()
```

## Testing Your Setup

Test your API connection with a simple request:

```python
def test_connection():
    try:
        # Test with a simple API call
        response = stack_client.get('/users')
        print("✅ Connection successful!")
        print(f"Found {len(response.json().get('users', []))} users")
        return True
    except Exception as e:
        print(f"❌ Connection failed: {e}")
        return False

# Run the test
if __name__ == "__main__":
    test_connection()
```

## Error Handling

Implement proper error handling for production use:

```python
import logging
from typing import Optional

logger = logging.getLogger(__name__)

class StackAuthError(Exception):
    """Base exception for Stack Auth errors"""
    pass

class StackAuthClient:
    # ... previous code ...
    
    def safe_request(
        self, 
        method: str, 
        endpoint: str, 
        data: Optional[Dict[str, Any]] = None
    ) -> Optional[Dict[str, Any]]:
        """Make a safe request with comprehensive error handling"""
        try:
            response = self._make_request(method, endpoint, data)
            return response.json()
        except requests.exceptions.ConnectionError:
            logger.error("Failed to connect to Stack Auth API")
            raise StackAuthError("Network connection failed")
        except requests.exceptions.Timeout:
            logger.error("Request to Stack Auth API timed out")
            raise StackAuthError("Request timed out")
        except Exception as e:
            logger.error(f"Stack Auth API error: {e}")
            raise StackAuthError(f"API request failed: {e}")
```

## Next Steps

With your API client set up, you can now:

- [Authenticate users](./user-sessions) with your application
- [Handle OAuth flows](./oauth-flows) for social login
- [Validate server-side sessions](./server-validation)

For detailed API reference, see the [REST API documentation](/api/overview). 
