Integrate SignalGate

SignalGate learns from your traffic before it blocks anything. Integration happens in two phases: first you plug the SDKs in and start logging events, then once enough events have accumulated, SignalGate turns on real-time blocking.

Quickstart

Phase 1 is a one-time setup (~10 minutes of code). Phase 2 is paced by your real traffic — you can't skip the data-gathering step.

Phase 1~10 minutes

Plug it in

Wire the SDKs into your stack so events start flowing. No blocking yet — you can't block what you can't recognize.

  1. 1

    Sign up and create an API key.

    Sign up at /signup, then go to Settings → API Keys → click “+ Create Key”. Your key starts with pk_live_ and is shown exactly once.

    The dashboard also surfaces your tenant's public keyat this step. You'll paste it into the frontend SDK in Step 2.

  2. 2

    Integrate the frontend SDK.

    Drop the SDK on every page where a sensitive action lives (login, signup, payment, OTP request). On submit, you receive an encrypted four-field envelope.

    See Frontend SDK reference → for install options, configuration, and the payload shape.

  3. 3

    Pass the fingerprint payload to your backend.

    Recommended: include the envelope in your existing request body as a top-level signalgate field.

    This is your call, not ours. Anything that gets the four-field envelope from the browser to your backend works — request body, custom header, dedicated endpoint, message queue. Pick whatever fits your stack.
  4. 4

    Install the backend SDK.

    Backend SDKs ship for Python, Node.js, Go, Java, PHP and C# (.NET) today. See Backend SDK reference → for install, client setup, and full code examples in every stack. For any other language, the HTTP API is small enough to wrap directly.

Phase 2days to weeks · paced by your real volume

Train it on your traffic

Log every action after it happens and every target action after it succeeds. Once SignalGate recognizes patterns, you create a workflow and turn on blocking.

  1. 5

    Log every action AND every target action.

    SignalGate learns from labeled pairs: the sensitive action, logged after it happens, and the target action, logged after it succeeds — once you've confirmed the action was legitimate. Both calls use client.log() — fire-and-forget, no verdict returned.

    See the event model below for what counts as an “action” vs “target action” in different scenarios.

    Don't skip the target_action log.Without it, SignalGate sees actions but can't tell which ones were legitimate. Detection trained on action-only data will misidentify normal users at random.
  2. 6

    Let events accumulate.

    Both call types stream into your Events feed. Keep the SDK in your hot path; real traffic does the rest. For most products, gathering enough events takes a few days.

  3. 7

    Create a flow in the dashboard.

    A flowtells SignalGate “for this method, find patterns that distinguish target actions from abandoned ones.” In the dashboard: click New flow on the Flows card, pick the method (e.g. login), name it, submit.

    Flow configurationis also exposed in the dashboard. Default settings cover most use cases out of the box; as you tune to your traffic shape you'll find knobs for sensitivity, minimum group size, and how aggressively the engine acts. Concrete options are still being finalized during the beta — start with defaults, or book a demo to talk through your setup.
  4. 8

    Let SignalGate learn from your traffic.

    Once it has learned enough from your traffic, detection turns on automatically for the workflows you've enabled — but it doesn't affect live traffic until you start calling check() in Step 9.

  5. 9

    Enable check() at the action place.

    Add a check() call before the action to get a verdict and decide whether to allow it. Keep the log() calls after the action succeeds and after the target-action succeeds, so learning continues with enforcement on.

    See Verdicts → for the verdict actions and how to handle each.

Why two phases?A system that starts enforcing from day one would either be useless (nothing learned yet) or trained on the wrong patterns (learned from someone else's traffic). You log first, let SignalGate learn from your own traffic, then enforce.

Event model

Two labels on every method: when the action happened, and when it led to the outcome you wanted. SignalGate learns from both.

action

Log the protected action after it happens — once your handler has carried it out, not the moment the request arrives. A failed attempt, such as a login with the wrong password, is not logged.

  • Login: credentials accepted
  • OTP code sent
  • Signup form accepted
  • Payment intent created
  • Password reset link sent
target_action

Log again when you have confirmed the action was legitimate. The trust signal comes from your business logic, not from the fingerprint.

  • Login: credentials valid AND 2FA passed
  • OTP: correct code entered within window
  • Signup: account converted (any real-use signal)
  • Payment: charge captured successfully
  • Password reset: new password set + used to log in

SignalGate's models compare behavior across these two buckets. A pattern common in action but rare in target_action is a fraud signal — the bigger the gap, the stronger the signal.

Every event must be unique. Both action and target_actionevents are deduplicated server-side via the nonce inside each fingerprint envelope. Don't replay the same envelope across two log calls — re-collect a fresh payload from the browser before each event, or use whatever per-event identifier mechanism your SDK exposes. A reused envelope is rejected with HTTP 422 (REQUEST_REJECTED), which means SignalGate will see only one half of the pair.
Custom fields are an extension point. Beyond the built-in target_action flag, you can attach arbitrary key/value pairs to any event via the custom dict. SignalGate surfaces them in the dashboard and (eventually) consumes them as additional signals over time. Conventions for which custom fields the engine will weigh are still being shaped — for now, treat customas a flexible passthrough that's available when you need it.
Common mistake: logging the moment a request arrives. If you call log() before your handler knows whether the action went through, failed attempts land in your data as if they had happened. Keep every log() call after its success: the action after it happens, the target action after it succeeds.

SDK versions

Current public releases. SDKs follow semantic versioning — minor bumps are non-breaking.

Need a client for a language not listed? The HTTP API is small enough to wrap yourself, or talk to us about prioritizing an official SDK.

Continue reading

Questions or stuck on integration? Get in touch — we read every message during beta.