Skip to main content

Flamecloak for Python

Standard library only (urllib), Python 3.9+, typed. Installed as flamecloak-sdk, imported as flamecloak_sdk.

pip install flamecloak-sdk

The developer guide, every status, and what to check before shipping: the Flamecloak developer guide.

import os
from flamecloak_sdk import Flamecloak

flamecloak = Flamecloak(os.environ["FLAMECLOAK_KEY"])

decision = flamecloak.authorize(
    "refund",
    resource=f"payment:{payment_id}",
    agent="support-bot",
    parameters={"amount": 1200},
)

if decision.allowed:
    refund = stripe.Refund.create(payment_intent=payment_id, amount=1200, idempotency_key=decision.decision_id)
    decision.done("succeeded", reference=refund.id)  # optional

Code that cannot wait (a request handler, a queue worker) asks without waiting and keeps the id:

asked = flamecloak.authorize("refund", parameters={"amount": 1200}, wait=False)
if asked.status == "pending":
    save_job(decision_id=asked.decision_id)
# later
decision = flamecloak.collect(decision_id)  # or flamecloak.wait(decision_id, max_wait_seconds=60)

Resuming the job when a person decides

Ask without waiting, with your job's own id as the idempotency key:

asked = flamecloak.authorize("refund", parameters={"amount": 1200}, idempotency_key=job.id, wait=False)

and resume it from the notice (see Notices). verify_webhook needs the RAW body (request.get_data() in Flask, await request.body() in Starlette):

from flask import request
from flamecloak_sdk import FlamecloakWebhookError, verify_webhook

@app.post("/flamecloak/notices")
def notice():
    try:
        event = verify_webhook(
            request.get_data(),
            request.headers.get("flamecloak-signature"),
            os.environ["FLAMECLOAK_WEBHOOK_SECRET"],
        )
    except FlamecloakWebhookError:  # .code says why
        return "", 400
    if event.decision_id is not None and event.idempotency_key is not None:
        job = jobs.find(event.idempotency_key)
        if job is not None:
            # THE NOTICE IS NOT THE PERMISSION; collect is, once.
            decision = flamecloak.collect(event.decision_id)
            if decision.allowed:
                refund(job, idempotency_key=event.decision_id)
            elif decision.status != "used":  # denied, expired, stale
                jobs.close(job, decision.status)
            # "used": this notice came again after the job ran. Nothing to do.
    return "", 200

A retried notice is harmless: its second collect answers used.

Flamecloak(key, base_url=None, timeout=10.0). base_url only for a key with no address or a self-hosted gateway; timeout is one request's, in seconds (a long-poll gets it on top of its wait). One client per process is enough, and it is safe to share between threads.

authorize() also takes idempotency_key, max_wait_seconds, and public_info (who asked and what changes, once your organisation has turned on Say who asked; see the guide). Errors are FlamecloakError, with .status set to the gateway's HTTP status, or None for a key that is not one.

When Flamecloak sits in front of an endpoint, call() makes the call and waits: a 423 pending (403 from a gateway older than October 2026) is sent again byte for byte with the decision, and a 202 (held) is waited on until the gateway has made the call itself.

result = flamecloak.call("https://api.example.com/api/orders/1")
# result.outcome: answered, executed, attempted, refused, pending or unavailable

See calls through your gateway.

What every status means, what raises, and what to check before shipping: the developer guide.

Apache License 2.0.

Metadata

Release files for flamecloak-sdk 0.3.1

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

Source distribution (sdist)

Source distribution for flamecloak-sdk 0.3.1
File Size Uploaded Provenance Actions
flamecloak_sdk-0.3.1.tar.gz 20.1 kB Without provenance Details for flamecloak_sdk-0.3.1.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for flamecloak-sdk 0.3.1
File Interpreter ABI Platform Actions
flamecloak_sdk-0.3.1-py3-none-any.whl Python 3 none any Details for flamecloak_sdk-0.3.1-py3-none-any.whl

Total release size: 38.5 kB

Release files / flamecloak_sdk-0.3.1.tar.gz

Download URL flamecloak_sdk-0.3.1.tar.gz
Size 20.1 kB
Tags Source
SHA-256 checksum
How to use checksums
89c401ebd02f1b4a868b151d6d361686c0866f219536e8ca911961e082d4e5d5
BLAKE2b-256 checksum
How to use checksums
128fb05fcc430c51f8cae8c10b40fa89725f767ca1984297a3b0d93d8c4bee1e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.2

Release files / flamecloak_sdk-0.3.1-py3-none-any.whl

Download URL flamecloak_sdk-0.3.1-py3-none-any.whl
Size 18.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
66eab67681cc91a57432b0f2acae95490997bc4a0eb92e29812e79aea05b00f8
BLAKE2b-256 checksum
How to use checksums
1a74558daa7b1124ff7e06485ebdf8576043ab9b98463a28e52f7ec4903111f7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.2

Security for flamecloak-sdk 0.3.1

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.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

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