Skip to main content

profy-sdk

Official Python SDK for the Profy App platform — OAuth token management and event reporting.

Installation

pip install profy-sdk

# With optional SQLAlchemy token storage:
pip install profy-sdk[sqlalchemy]

Quick Start

from profy import ProfyApp

async with ProfyApp(
    client_id="your-app-id",
    client_secret="your-app-secret",
) as profy:
    # Exchange authorization code for tokens
    token = await profy.exchange_code(code, "https://your-app.com/callback")

    # Report a billing event
    await profy.report_event("generate_report", token=token)

Synchronous Usage

from profy import ProfyAppSync

with ProfyAppSync(
    client_id="your-app-id",
    client_secret="your-app-secret",
) as profy:
    token = profy.exchange_code(code, redirect_uri)
    profy.report_event("generate_report", token=token)

Features

  • OAuth2 Authorization Code Flow — exchange codes, refresh tokens automatically
  • Events API — report billing events with auto token refresh and retry on 401
  • Async + SyncProfyApp (async) and ProfyAppSync (sync) clients
  • Type hints — full type annotations, PEP 561 compatible
  • Minimal dependencies — only httpx
  • Optional SQLAlchemy integration — pre-built token model + store

Token Persistence (Optional)

Using SQLAlchemy

from profy import ProfyApp
from profy.contrib.sqlalchemy import create_token_model, SQLAlchemyTokenStore

# 1. Create the ORM model (auto-creates table with Base.metadata.create_all())
ProfyOAuthToken = create_token_model(Base)

# 2. Create store
store = SQLAlchemyTokenStore(async_session_factory, ProfyOAuthToken)

# 3. Initialize SDK with persistence
profy = ProfyApp(
    client_id="...",
    client_secret="...",
    on_token_refresh=store.on_refresh,
)

# 4. Save after exchange
token = await profy.exchange_code(code, redirect_uri)
await store.save(token.user_id, token, scope="events:write")

# 5. Load later
saved = await store.load(user_id)

Custom Storage

from profy import ProfyApp, TokenData

async def persist_token(token: TokenData):
    await redis.set(f"profy:{token.user_id}", token.access_token)

profy = ProfyApp(
    client_id="...",
    client_secret="...",
    on_token_refresh=persist_token,
)

API Reference

ProfyApp / ProfyAppSync

Method Description
exchange_code(code, redirect_uri) Exchange authorization code for tokens
refresh_token(refresh_token) Manually refresh an expired token
report_event(event_name, *, token, idempotency_key?, metadata?) Report a billing event

TokenData

@dataclass
class TokenData:
    access_token: str
    refresh_token: str
    user_id: str
    expires_at: float  # unix timestamp

    @property
    def is_expired(self) -> bool: ...

Exceptions

Class Status Description
AuthExpired 401 Token expired and refresh failed
InsufficientBalance 402 User has insufficient credits
InvalidEvent 400 Event name not configured
ProfyApiError varies Generic API error

Documentation

License

MIT

Release files for profy-sdk 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for profy-sdk 0.1.0
File Size Uploaded
profy_sdk-0.1.0.tar.gz 7.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for profy-sdk 0.1.0
File Interpreter ABI Platform
profy_sdk-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 15.5 kB

Release files / profy_sdk-0.1.0.tar.gz

Download URL profy_sdk-0.1.0.tar.gz
Size 7.7 kB
Tags Source
SHA-256 checksum
How to use checksums
41f7c6b42c4199e474cbd6936cf557be2649a4fd9a593247cfec515b5255e9aa
BLAKE2b-256 checksum
How to use checksums
25c4550fc342d9f6a5349d57447ddaaab57128a8dd374f29f32f283570f9c2cb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.11.14

Release files / profy_sdk-0.1.0-py3-none-any.whl

Download URL profy_sdk-0.1.0-py3-none-any.whl
Size 7.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c2fea943182e161a208fc2c29e610e9398fa8cff9278b734408f31cb0b59888d
BLAKE2b-256 checksum
How to use checksums
aa02ce34bcbaeb8405f84c8e8209fc11d989892c8403b8b5420e67ee6303f103
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.11.14

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page