effaced-stripe
First-party effaced resolver for Stripe — export and erase a data subject's billing PII held in Stripe.
- Export (Art. 15): customer profile, addresses, and payment-method metadata.
- Erase (Art. 17): Stripe customer deletion, which Stripe itself implements as a GDPR-aware redaction.
uv add effaced effaced-stripe
from effaced import ResolverRegistry, SubjectRef
from effaced_stripe import StripeResolver
registry = ResolverRegistry()
registry.register(StripeResolver(api_key="rk_live_..."))
# Refs of kind "stripe" are routed to this resolver; the value is the
# Stripe customer id.
ref = SubjectRef(kind="stripe", value="cus_...")
Restricted-key setup
Don't hand the resolver your full secret key. Create a restricted key (Dashboard → Developers → API keys → Create restricted key) with exactly the permissions the resolver uses:
| Permission | Access | Used for |
|---|---|---|
| Customers | Write | retrieve for export, delete for erasure |
| Payment Methods | Read | payment-method metadata in exports |
Everything else stays None. A key missing one of these surfaces as a
non-retryable ResolverError the first time the saga touches Stripe.
What gets exported — and what never is
Exported, when populated: customer email, name, phone, billing and
shipping addresses, and per payment method its type, card metadata
(brand, last4, exp_month, exp_year), and billing details.
Never exported:
- Full card numbers. Stripe does not expose PANs over its API, so no export from this resolver can ever contain one — don't let anyone tell you otherwise.
metadatadicts. Their contents are defined by your application; the resolver cannot know what they hold. Export those fields through your own data map instead.
Changing the exported field set is behaviour under effaced's widened SemVer: additions are MINOR, removals MAJOR.
Idempotency & error semantics
- Erasing a customer Stripe no longer knows is success
(
already_absent=True), never an error — saga retries depend on it. - Rate limits (429), connection faults, and Stripe-side errors (5xx)
propagate so the saga runner retries with backoff. Bad or
under-permissioned keys and malformed requests raise
ResolverErrorand abandon fast. SDK-internal retries are disabled; the saga runner owns retry policy.
Testing
No live calls: pass http_client= (any stripe.HTTPClient) to fake the
transport. The package is verified against the shared
effaced.testing.ResolverConformanceSuite — subclass it the same way to
certify your own resolver.
Not legal advice. effaced provides technical mechanisms for implementing data-subject rights. It does not make you GDPR-compliant and does not constitute legal advice.
Licensed under Apache-2.0.
Metadata
Release files for effaced-stripe 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| effaced_stripe-0.1.0.tar.gz | 16.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| effaced_stripe-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 28.0 kB
Release files / effaced_stripe-0.1.0.tar.gz
| Download URL | effaced_stripe-0.1.0.tar.gz |
|---|---|
| Size | 16.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6d9a2c6a89b46d047ac2a911a47f351bbe78fa1453bccffaeb5f0d3eada14214
|
|
BLAKE2b-256 checksum How to use checksums |
8dd07f1d436230d1615fff31fbe5fff38b2d19df7d5d78ddfb13c9876f928f0c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 11, 2026.
Transparency logRelease files / effaced_stripe-0.1.0-py3-none-any.whl
| Download URL | effaced_stripe-0.1.0-py3-none-any.whl |
|---|---|
| Size | 12.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
50708cdd3f24ff5baa6b0232657900fee57d62e69730fd7561a3bed1c89d3cf9
|
|
BLAKE2b-256 checksum How to use checksums |
65be5cbb234222e5b6b252c4940c79b4c50f5d37e022a67c9617d000093b951a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 11, 2026.
Transparency log