> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.governanceaicore.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.governanceaicore.com/_mcp/server.

# Python Examples

> Python code examples for GovernanceAI API

# Python Examples

Integrate GovernanceAI with Python applications.

## Installation

```bash
pip install requests python-dotenv
```

## Basic Setup

```python
import requests
import os
from dotenv import load_dotenv

load_dotenv()

API_KEY = os.getenv('GOVERNANCEAI_API_KEY')
ORG_ID = os.getenv('GOVERNANCEAI_ORG_ID')
BASE_URL = 'https://api.governanceai.com/v1'

headers = {
    'Authorization': f'Bearer {API_KEY}',
    'Content-Type': 'application/json'
}
```

## Evaluate Guardrails

```python
def evaluate_guardrails(user_message, user_id):
    """Evaluate a message against guardrails"""

    payload = {
        "messages": [
            {"role": "user", "content": user_message}
        ],
        "context": {
            "org_id": ORG_ID,
            "user_id": user_id
        }
    }

    response = requests.post(
        f'{BASE_URL}/guardrails/evaluate',
        headers=headers,
        json=payload
    )

    if response.status_code == 200:
        result = response.json()
        return {
            'decision': result['decision'],
            'risk_score': result.get('risk_score', 0),
            'violations': result.get('policy_violations', [])
        }
    else:
        raise Exception(f"API error: {response.status_code}")

# Usage
result = evaluate_guardrails("My credit card is 4532-1111-2222-3333", "user_123")
print(f"Decision: {result['decision']}")
print(f"Risk Score: {result['risk_score']}")
```

## Create Policy

```python
def create_policy(policy_name, guardrail_ids):
    """Create a new policy"""

    payload = {
        "name": policy_name,
        "guardrail_ids": guardrail_ids,
        "scope": "organization",
        "enforcement": {
            "mode": "blocking",
            "log_violations": True
        }
    }

    response = requests.post(
        f'{BASE_URL}/policies',
        headers=headers,
        json=payload
    )

    return response.json()

# Usage
policy = create_policy(
    "Production Safety",
    ["guardrail_pii", "guardrail_toxic"]
)
print(f"Policy created: {policy['policy_id']}")
```

## Run Scan

```python
def run_scan(scan_type, repositories):
    """Run a code scan"""

    payload = {
        "scan_type": scan_type,
        "repositories": repositories
    }

    response = requests.post(
        f'{BASE_URL}/scans',
        headers=headers,
        json=payload
    )

    scan = response.json()
    return scan['scan_id']

# Usage
scan_id = run_scan("code_scan", ["repo_1", "repo_2"])
print(f"Scan started: {scan_id}")
```

## Error Handling

```python
def make_request(method, endpoint, data=None):
    """Make API request with error handling"""

    try:
        if method == 'GET':
            response = requests.get(f'{BASE_URL}{endpoint}', headers=headers)
        elif method == 'POST':
            response = requests.post(f'{BASE_URL}{endpoint}', headers=headers, json=data)

        if response.status_code == 401:
            raise ValueError("Invalid API key")
        elif response.status_code == 403:
            raise PermissionError("Insufficient permissions")
        elif response.status_code >= 500:
            raise RuntimeError("Server error")

        return response.json()
    except requests.RequestException as e:
        print(f"Network error: {e}")
        return None
```

## Next Steps

* **[Node.js Examples](/code-examples/node-js)** - JavaScript code
* **[API Patterns](/code-examples/api-patterns)** - Common patterns
* **[Quick Start](../05-quick-start.mdx)** - First API call