Skip to main content

SignalGate antifraud backend SDK for Python — thin HTTP forwarder to api.signalgate.ai

Project description

signalgate — Python backend SDK

Python 3.10+ License: Apache 2.0

Thin HTTP forwarder for SignalGate antifraud. Tenants embed this in their backend to call /v0/check (synchronous verdict) and /v0/log (async analytics). The SDK does no crypto — the opaque encrypted payload comes from @signalgate/frontend-js-sdk.

Install

pip install signalgate

For local development against an unpublished checkout:

pip install -e /path/to/backend-python-sdk

Quickstart

check() and log() are two calls at two points in your funnel, not two ways to send one event:

  • check()before the action you're gating. Synchronous; returns a verdict so you can block or allow. The server records the check for analytics.
  • log()after the action completes. Fire-and-forget telemetry; no verdict.

A typical flow calls both:

from signalgate import Client, Event, EncryptedPayload

client = Client(api_key="<your-jwt>")

# 1. BEFORE the gated action — get a verdict and gate on it.
gate_event = Event(
    user_id="u_123",
    ip=request.headers.get("X-Forwarded-For", request.remote_addr),
    method="checkout",
    timestamp="2026-04-01T13:08:50+00:00",
    payload=EncryptedPayload(**frontend_payload_dict),  # verbatim from the browser (incl. v=2)
    custom={"plan": "pro"},
)
verdict = client.check(gate_event)
if verdict.action == "block":
    raise PermissionError("blocked by SignalGate")

charge_the_customer()  # your paid action

# 2. AFTER the action completes — log it (fire-and-forget analytics).
client.log(done_event)  # a fresh event captured at this funnel point

You can also call log() on its own for actions you aren't gating — background jobs, downstream clientPaidAction completions, page-view telemetry, etc.

Distinct events per call. check and log fire at different moments, so each carries its own event with its own fingerprint payload (its own nonce). Don't forward the byte-identical payload to both back-to-back — the server's nonce-freshness guard would replay-reject the second.

At process shutdown:

client.close()  # drains the log queue within 5 × log_timeout_ms

Or use it as a context manager:

with Client(api_key="...") as client:
    client.check(event)

Configuration

Override the defaults selectively:

Client(
    api_key="...",
    check_timeout_ms=3000,
    log_timeout_ms=1000,
    log_queue_capacity=10000,
    log_max_retries=3,
    fail_open=True,   # default: on timeout/5xx, check() returns allow
)

Error handling

check() raises on 4xx (tenant bug — bad JWT, malformed event). With fail_open=True (default), timeouts / network errors / 5xx return a synthesized CheckResult(action="allow", failed_open=True).

from signalgate import ServerError, TimeoutError, NetworkError

try:
    result = client.check(event)
except ServerError as e:
    # e.status_code, e.code, e.message, e.request_id, e.details
    ...

log() never raises. Failures are counted in client.metrics.

Metrics

client.metrics.get("check_total")
client.metrics.get("check_failed_open_total")
client.metrics.get("log_dropped_total", reason="queue_full")
client.metrics.snapshot()  # all counters

Full counter list:

Counter Labels Incremented when
check_total check() called
check_success_total check() returned a real verdict
check_failed_open_total check() returned a synthesized allow
check_error_total type check() raised
log_enqueued_total log() accepted into queue
log_sent_total server acknowledged a log event
log_http_error_total status a log retry was triggered
log_dropped_total reason queue_full / closed / retry_exhausted

Development

pip install -e ".[dev]"   # install with dev extras
pytest -q                 # run the test suite

CI runs pytest -q on every push and PR to main via .github/workflows/test.yml (Python 3.12, pip cache keyed on pyproject.toml).

License

Licensed under the Apache License, Version 2.0.

Links

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

signalgate-0.3.1.tar.gz (16.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

signalgate-0.3.1-py3-none-any.whl (16.5 kB view details)

Uploaded Python 3

File details

Details for the file signalgate-0.3.1.tar.gz.

File metadata

  • Download URL: signalgate-0.3.1.tar.gz
  • Upload date:
  • Size: 16.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.9

File hashes

Hashes for signalgate-0.3.1.tar.gz
Algorithm Hash digest
SHA256 e8f978823fcafdd79ee8ef9b304d1bfda116a95a2d56f4df782ad6ca2eeae296
MD5 1e67aaa96b276bd496e3377305ba3eec
BLAKE2b-256 563b116338cacfa13979b013b2d42c3dfd7995ace5dd93a73f6089e80ed603ae

See more details on using hashes here.

File details

Details for the file signalgate-0.3.1-py3-none-any.whl.

File metadata

  • Download URL: signalgate-0.3.1-py3-none-any.whl
  • Upload date:
  • Size: 16.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.9

File hashes

Hashes for signalgate-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 1ea030d28b0dfc7af48248792426a914c024b01957bc2cbfa65414f1be12c97e
MD5 1543b39d0c1e6bbef8624d38ecf4621f
BLAKE2b-256 cfa0b15993fce96bda191b5885c90c9201ff7c8e42e761af4610e477663e2ca7

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page