# Users API

This document outlines the API endpoints for managing users in PySpur.
Users and sessions are required for deploying agents and chatbots that maintain message history.

## Create User

**Description**: Creates a new user. If a user with the given external ID already exists, returns the existing user.

**URL**: `/user/`

**Method**: POST

**Request Payload**:
```python
class UserCreate:
    external_id: str  # External identifier for the user
    user_metadata: Optional[Dict[str, Any]] = None  # Additional metadata about the user
```

**Response Schema**:
```python
class UserResponse:
    id: str  # User ID (prefixed with 'U')
    external_id: str  # External identifier for the user
    user_metadata: Optional[Dict[str, Any]]  # Additional metadata about the user
    created_at: datetime  # When the user was created
    updated_at: datetime  # When the user was last updated
```

## List Users

**Description**: Lists users with pagination.

**URL**: `/user/`

**Method**: GET

**Query Parameters**:
```python
skip: int = 0  # Number of users to skip (min: 0)
limit: int = 10  # Number of users to return (min: 1, max: 100)
```

**Response Schema**:
```python
class UserListResponse:
    users: List[UserResponse]  # List of users
    total: int  # Total number of users
```

## Get User

**Description**: Gets a specific user by ID.

**URL**: `/user/{user_id}/`

**Method**: GET

**Parameters**:
```python
user_id: str  # User ID (prefixed with 'U')
```

**Response Schema**:
```python
class UserResponse:
    id: str  # User ID (prefixed with 'U')
    external_id: str  # External identifier for the user
    user_metadata: Optional[Dict[str, Any]]  # Additional metadata about the user
    created_at: datetime  # When the user was created
    updated_at: datetime  # When the user was last updated
```

## Update User

**Description**: Updates a user.

**URL**: `/user/{user_id}/`

**Method**: PATCH

**Parameters**:
```python
user_id: str  # User ID (prefixed with 'U')
```

**Request Payload**:
```python
class UserUpdate:
    external_id: Optional[str] = None  # External identifier for the user
    user_metadata: Optional[Dict[str, Any]] = None  # Additional metadata about the user
```

**Response Schema**:
```python
class UserResponse:
    id: str  # User ID (prefixed with 'U')
    external_id: str  # External identifier for the user
    user_metadata: Optional[Dict[str, Any]]  # Additional metadata about the user
    created_at: datetime  # When the user was created
    updated_at: datetime  # When the user was last updated
```

## Delete User

**Description**: Deletes a user.

**URL**: `/user/{user_id}/`

**Method**: DELETE

**Parameters**:
```python
user_id: str  # User ID (prefixed with 'U')
```

**Response**: 204 No Content