Metadata-Version: 2.4
Name: pulr-sdk
Version: 0.4.0
Summary: Official Python SDK for pulr.ai — secure file exchange for AI agents: upload, share, fetch, approve, and verify files with provenance, scanning, capability URLs, and signed receipts.
Project-URL: Homepage, https://pulr.ai
Project-URL: Repository, https://github.com/taleilon/pulr
Project-URL: Issues, https://github.com/taleilon/pulr/issues
Author: Tal Eilon
License-Expression: MIT
Keywords: ai-agents,artifacts,capability-urls,file-exchange,langchain,provenance,pulr
Requires-Python: >=3.9
Provides-Extra: langchain
Requires-Dist: langchain-core>=0.1; extra == 'langchain'
Provides-Extra: verify
Requires-Dist: cryptography>=41; extra == 'verify'
Description-Content-Type: text/markdown

# pulr-sdk

Official Python SDK for [pulr.ai](https://pulr.ai) — secure file exchange for AI agents. Zero runtime dependencies; downloads are SHA-256-verified client-side.

```bash
pip install pulr-sdk            # core (stdlib only)
pip install pulr-sdk[verify]    # + Ed25519 receipt verification
pip install pulr-sdk[langchain] # + LangChain tools
```

```python
from pulr import PulrClient, verify_receipt

pulr = PulrClient()  # reads PULR_API_KEY

artifact = pulr.upload(
    file_path="q3-report.pdf",
    expires_in="48h",
    approval=True,  # link stays dormant until a human approves on the review page
    provenance={"workflow": "quarterly-report", "model": "claude-fable-5"},
    restrictions={"allow_countries": ["US"]},
)
print(artifact["review_url"])

# once approved — anyone with the link fetches, integrity-verified
data, sha256 = pulr.fetch_capability(artifact["download_url"])

# Ed25519-signed proof of hash + provenance + scan + approval
receipt = pulr.receipt(artifact["artifact_id"])
assert verify_receipt(receipt)  # needs [verify] extra
```

LangChain agents:

```python
from pulr.langchain_tool import pulr_tools
tools = pulr_tools(PulrClient())  # pulr_upload / pulr_fetch / pulr_share StructuredTools
```

Full API: `upload`, `get`, `download`, `fetch_capability`, `share`, `list`, `revoke`, `receipt` / `verify_receipt`, `whoami`, `usage`, `audit`, `create_key`, `set_webhook`. Get a workspace + key at [pulr.ai/app](https://pulr.ai/app).

MIT © Tal Eilon

## Sealed handoff — no link at all

When the recipient has a pulr workspace, send straight to their address (`pa_...`):

```python
pulr.send("pa_...", file_path="deck.pdf", message="final version")

# recipient side
offers = pulr.inbox()                 # sender, agent id, Ed25519 status, scan, sha256
pulr.accept(offers[0]["offer_id"])    # integrity-verified copy enters the workspace
# or: pulr.reject(offers[0]["offer_id"])

pulr.address()                        # your own receiving address
pulr.set_address(rotate=True)         # old address dies instantly
```

No capability URL is ever created; both sides' receipts carry a `handoff` block.
