Metadata-Version: 2.4
Name: cortova
Version: 0.1.0
Summary: Official Python SDK for the Cortova CRM API.
Author: Cortova
License: Apache-2.0
Project-URL: Homepage, https://app.cortova.ai
Project-URL: Documentation, https://app.cortova.ai/api/docs
Keywords: cortova,crm,sdk,api
Requires-Python: >=3.9
Description-Content-Type: text/markdown
Requires-Dist: httpx>=0.27

# cortova

Official Python SDK for the [Cortova CRM](https://app.cortova.ai) API.

```bash
pip install cortova
```

## Quickstart

```python
from cortova import Cortova

ctv = Cortova(api_key="ctv_...")

# Single page
page = ctv.companies.list(limit=25)
print(page.count, len(page.items), page.next_cursor)

# Auto-paginated iterator — handles cursors for you
for lead in ctv.leads.iter():
    print(lead["companyName"])

# Create a record
new = ctv.companies.create(name="Acme Corp", industry="SaaS")
print(new["id"])
```

Reads `CORTOVA_KEY` from the environment when `api_key` isn't passed.

## What's covered

- `ctv.companies` — `list`, `get`, `create`, `iter`, `contacts`, `iter_contacts`
- `ctv.leads` — `list`, `get`, `create`, `iter`
- `ctv.opportunities` — `list`, `get`, `iter` (`status="open" | "won" | "lost" | "all"`)
- `ctv.activities` — `list`, `iter`
- `ctv.tasks` — `list`, `get`, `iter` (`active_only=True|False`)
- `ctv.pipelines` — `list`, `get`, `iter`

Every `iter()` paginates automatically with cursors — no manual `after`/`limit` bookkeeping.

## Errors

```python
from cortova import Cortova, CortovaError
try:
    ctv.companies.get("not-real")
except CortovaError as e:
    print(e.status, e.body)
```

## License

Apache-2.0.
