Metadata-Version: 2.4
Name: contractsign
Version: 0.1.0
Summary: Python SDK for the ContractSign API
Project-URL: Homepage, https://contractsign.net
Project-URL: Documentation, https://contractsign.net/llms.txt
Project-URL: Repository, https://github.com/happenings-dk/contractsign-python
Author-email: Happenings Group A/S <hello@contractsign.net>
License-Expression: MIT
License-File: LICENSE
Keywords: api,contracts,contractsign,digital-signing,e-signature
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Typing :: Typed
Requires-Python: >=3.10
Requires-Dist: httpx<1,>=0.27
Description-Content-Type: text/markdown

# contractsign

Python SDK for the [ContractSign](https://contractsign.net) API. Create contracts, send them for digital signing, manage templates, and track signing status — all from Python.

## Install

```bash
pip install contractsign
```

## Quick start

```python
from contractsign import ContractSign, CreateContractInput, CreateSigningInput, SignerInput, SignerRole, SigningMethod

client = ContractSign(api_key="cs_...")

# Create a contract
contract = client.contracts.create(CreateContractInput(
    title="Consulting Agreement",
    content="<h1>Consulting Agreement</h1><p>...</p>",
))
contract_id = contract["data"]["id"]

# Send for signing
signing = client.signing.create(CreateSigningInput(
    contract_id=contract_id,
    signers=[
        SignerInput(
            name="Jane Doe",
            email="jane@example.com",
            role=SignerRole.SIGNER,
            signing_method=SigningMethod.SMS_OTP,
            order=1,
        ),
    ],
))

print(f"Signing request created: {signing['data']['id']}")
```

## Context manager

The client can be used as a context manager to ensure the HTTP connection is closed:

```python
with ContractSign(api_key="cs_...") as client:
    contracts = client.contracts.list(limit=10)
    for contract in contracts["data"]:
        print(contract["title"])
```

## Resources

| Resource | Methods |
|----------|---------|
| `client.contracts` | `list()`, `get()`, `create()`, `update()`, `delete()`, `duplicate()`, `pdf()`, `list_parties()`, `add_party()`, `update_party()`, `delete_party()` |
| `client.signing` | `create()`, `get()`, `cancel()`, `remind()` |
| `client.templates` | `list()`, `get()`, `create()`, `update()`, `delete()` |
| `client.folders` | `list()`, `get()`, `create()`, `update()`, `delete()` |
| `client.tags` | `list()`, `create()`, `update()`, `delete()` |
| `client.account` | `me()`, `get_organization()`, `update_organization()`, `list_api_keys()`, `create_api_key()`, `delete_api_key()` |

## Error handling

```python
from contractsign import ContractSign, NotFoundError, AuthenticationError, ValidationError

client = ContractSign(api_key="cs_...")

try:
    contract = client.contracts.get("nonexistent-id")
except NotFoundError:
    print("Contract not found")
except AuthenticationError:
    print("Invalid API key")
except ValidationError as e:
    print(f"Invalid input: {e.message}")
```

## Configuration

```python
client = ContractSign(
    api_key="cs_...",
    base_url="https://contractsign.net",  # default
    timeout=30.0,                          # seconds, default
)
```

## Types

All input and output types are available as dataclasses with full type hints:

```python
from contractsign import (
    ContractStatus,
    SigningOrder,
    SignerRole,
    SigningMethod,
    CreateContractInput,
    CreateSigningInput,
    CreateTemplateInput,
    CreateFolderInput,
    CreateTagInput,
    CreatePartyInput,
    PartyType,
)
```

## License

MIT
