Skip to main content
proofage has a sync and an async client for every endpoint, typed Pydantic models, typed errors, and webhook verification with extras for FastAPI, Django and Flask.

Install

Supported Python versions

A Python version stays supported for 12 months after its upstream end of life.

Configure

Create a verification

AsyncProofAge has the same methods, awaited, for FastAPI, aiogram and other asyncio code:

Read results

Statuses are VerificationStatus members; a status this version does not know arrives as a plain string, so compare with ==:

Receive webhooks

A request that fails verification never reaches your handler: it is answered 401 with the reason. De-duplicate on event.delivery_id, which stays the same on every automatic retry.

Errors and retries

AuthenticationError (401), PaymentRequiredError (402), PermissionDeniedError (403), NotFoundError (404), ValidationError (422), RateLimitError (429), ServerError (5xx) and TransportError (no response) all extend ProofAgeError, which has status_code, code and message. A GET is retried on 408, 429, 5xx, timeouts and connection failures. A POST is retried only on 429 and when the connection never opened. A 429 waits for Retry-After up to 60 seconds; a longer one raises RateLimitError with retry_after set. client.workspace.consent() returns the active consent text, and client.verifications.accept_consent, upload_media and submit do the rest of Capture in your own UI.