Legal Document

Privacy Policy

Effective: 2026-04-11 Last reviewed: 2026-04-11

Gait collects behavioral metadata — never message content — to detect automated and bot accounts on Discord. This document explains exactly what we collect, how it's anonymized, and your rights.

01 What Gait Is

Gait is a behavioral bot-detection tool for Discord server moderators. It operates as a Discord bot that observes behavioral metadata — timing patterns, interaction cadence, account characteristics — to produce a probabilistic score indicating the likelihood that a Discord account is automated (bot, script, or AI agent). Scores are made available to guild administrators ("server admins") to help them moderate their communities.

NOTE Gait does not read, store, or process the content of any message.

02 Who Controls Your Data

Guild administrators are data controllers

Discord guild (server) administrators choose to install the Gait bot. By doing so, they become the data controller for the behavioral signals collected from members of their server. Guild admins determine whether Gait is installed, the alert threshold for notifications, and whether to act on a score.

Gait is a data processor

Gait processes data on behalf of guild administrators under their instruction. Gait does not sell data, does not use data for advertising, and does not share data with third parties.

03 What Data Is Collected

Gait collects behavioral metadata only. No message content, usernames, display names, or avatars are stored. The tables below list exactly which signals are recorded, sourced directly from the bot's event handlers.

Guild join

FieldDescription
account_age_daysAge of the Discord account in days at join time
has_avatarBoolean — whether the account has a custom avatar set
has_default_avatarBoolean — whether the account uses Discord's generated default avatar
username_entropyShannon entropy of the username string — a statistical measure of character randomness. The username text itself is never stored.
public_flag_countCount of Discord public flags (e.g. Early Supporter, HypeSquad). Individual flag types are not stored, only the count.
has_nitroBoolean — whether the account holds an active Nitro subscription at join time

Message activity

FieldDescription
msg_lengthCharacter count of the message (not the text itself)
has_attachmentBoolean — whether the message included a file attachment
has_embedBoolean — whether the message included a link embed
mention_countNumber of user mentions in the message
is_replyBoolean — whether the message is a reply to another message
reply_latency_msMilliseconds between the parent message and this reply (only when is_reply is true)
typing_duration_msDuration of the typing indicator before send, in milliseconds. Ephemeral — never persisted independently.

Message edits

FieldDescription
msg_lengthCharacter count of the edited message
edit_latency_msMilliseconds between original send and the edit

Reactions

FieldDescription
reaction_latency_msMilliseconds between the message's creation and the reaction being added
emoji_categoryCoarse category: custom, face, hand, or symbol. The specific emoji is not stored.
message_age_msAge of the reacted-to message at the time of reaction

Voice activity

FieldDescription
duration_msDuration of the voice session in milliseconds
was_mutedBoolean — whether the user was self-muted
was_deafenedBoolean — whether the user was self-deafened

Presence changes

FieldDescription
old_statusPrevious status string (online / idle / dnd / offline)
new_statusNew status string
client_is_mobileBoolean — connected via mobile client
client_is_desktopBoolean — connected via desktop client
client_is_webBoolean — connected via web client

Server departure

When a user leaves or is removed from a server, only the anonymized user identifier and a timestamp are recorded. No other properties are captured.

What is explicitly NOT collected

Data typeStatus
Message content (text)Never collected, stored, or transmitted
Usernames / display namesUsed transiently to compute entropy, then discarded
Avatar images or URLsNever collected
Email addressesNever collected
IP addressesNever collected
Voice audioNever collected — only session duration and mute/deafen flags
Direct messages (DMs)Bot ignores all non-guild events
Bot account activityAll event handlers filter out bot accounts

04 How User Identifiers Are Anonymized

Gait never stores a raw Discord user ID anywhere — not in databases, not in logs, not in API payloads.

Discord User ID (snowflake)
  │
  │  HMAC-SHA-256(user_id, secret salt)
  │    — computed server-side within Gait —
  ▼
GIID  (Gait Internal ID — the only user identifier ever
       stored, sent in API payloads, or placed on the
       internal message bus)

Your Discord user ID is run through a one-way cryptographic hash (HMAC-SHA-256 with a secret salt) before anything is stored. Only the result — the GIID — is ever written to a database, included in an API payload, or placed on the internal message bus. The GIID cannot be reversed to reveal the original user ID, whether by Gait staff or through a database breach.

When you exercise your data rights (export or erasure), Gait's API re-derives your GIID from the user ID you supply using the same one-way hash, in order to locate your records. The raw user ID is used only transiently for that lookup and is never stored.

A strict property allowlist is enforced before any event leaves the bot process. Any property not on the allowlist is silently dropped, preventing accidental transmission of unanticipated fields including message content.

05 Cross-Server Data Aggregation

Gait observes behavior across every Discord server where it is installed. Behavioral signals from all servers are aggregated under a single GIID per user.

IMPORTANT A user who is a member of multiple Gait-monitored servers will have their behavioral signals from all those servers combined into one scoring profile. This cross-server view is intentional — patterns invisible within a single server become detectable in the aggregate.

Discord users who are members of Gait-monitored servers have no direct mechanism to opt out of data collection at this time. Server admins can remove Gait from their server to stop future collection for that server's members.

06 What Is Computed From the Data

DimensionWhat it measuresSignals used
dim_temporalRegularity of timing patternsInter-message interval variability, reply latency variability, typing-speed variability
dim_contentVariability in message characteristicsMessage length distribution, edit rate
dim_lifecycleAccount maturity indicatorsAccount age, username entropy, custom avatar presence
dim_socialSocial interaction patternsReserved for Phase 2 — hardcoded to 0.5 (neutral). Has no effect on current scores.

The final score is a weighted mean of these dimensions. A minimum number of behavioral data points must be collected before a score is computed; the exact threshold may be tuned over time based on scoring quality. Scores below 0.45 trigger an alert to server admins.

07 Data Storage and Retention

TimescaleDB — behavioral time-series

TableContentsRetention
behavioral_eventsRaw event records (GIID, event type, timestamp, properties)72 hours — automatic rolling deletion
account_featuresComputed feature vectors90 days — automatic rolling deletion

PostgreSQL — account and scoring store

TableContentsRetention
accountsOne row per GIID: first seen, last seen, data point count730 days of inactivity — automated nightly purge
scoresCurrent score, classification, dimension scores per GIID365 days — automated nightly purge
feedbackAdmin actions on alerts365 days — automated nightly purge
alertsAlerts sent to server admins180 days — automated nightly purge

Automated retention is enforced by a scheduled job that runs daily at 03:00 UTC.

08 Who Can Access Stored Data

DataAccessible by
Behavioral events (72h window)Worker process (feature extraction only)
Feature vectorsWorker process (scoring) and API (internal only)
Scores and classificationsGuild admins via bot command; Gait platform operators
AlertsGuild admins in their configured alert channel; Gait operators
Admin feedback/labelsGait operators (used for model evaluation)

GIIDs are never exposed to end users. Score queries return the score, classification, and dimensional breakdown only. The GIID is, however, included in the responses of the operator-only data-rights endpoints (GET /v1/data-rights/export and DELETE /v1/data-rights/erase), which require an API key and are used by guild admins and Gait operators to fulfil access and erasure requests — it serves there as a stable, one-way reference handle for correlating the export with internal records. The end-user self-service surfaces (/gait my-data and /gait forget-me) never return a GIID.

09 Your Rights (GDPR / CCPA)

Right of access

Guild admins can request a full machine-readable export of all data held for a user via GET /v1/data-rights/export. The response includes all behavioral events, feature vectors, scores, feedback, and alerts for that GIID. There is no end-user self-service portal; requests must be routed through a guild admin or submitted to Gait directly via the contact in Section 12.

Right to erasure

Any Discord user can erase their own data by running the /gait forget-me command in any server where Gait is installed. The command requires no admin permission and erases all data for the requesting user across every Gait-monitored server, not just the one the command is invoked in. Because GIIDs are one-way HMAC hashes, deletion is irreversible. If you remain in Gait-monitored servers afterwards, fresh signals will be collected under a new internal identifier with no link to your prior history.

Guild admins can also trigger erasure on behalf of a user via the DELETE /v1/data-rights/erase API endpoint.

Right to inspect your own data

Any Discord user can view a summary of the behavioral data Gait holds on their account by running the /gait my-data command. The summary shows when Gait first and last observed your account, how many data points have been collected, your current score and classification, and how many servers contributed signals — without exposing your internal identifier (GIID).

Right to object / opt out

Gait does not offer a "monitor everyone except me" mode. Members who do not want their behavioral signals collected can erase their data on demand via /gait forget-me, or leave Gait-monitored servers, or request that a server admin remove Gait from the server.

CCPA — Do Not Sell

Gait does not sell personal data to third parties.

Open gaps

RightStatus
Data access (admin-facing)Implemented
Erasure (admin-facing)Implemented
End-user self-service erasureImplemented — /gait forget-me
End-user self-service data summaryImplemented — /gait my-data
Individual opt-out while staying in serverBy design — erase, leave, or ask the server admin to remove Gait
Data portability (user-initiated)Partial — JSON export available to guild admins

10 Data Security

All identifiers are cryptographically hashed before storage using HMAC-SHA-256. The secret salt used in hashing is held only within Gait's own server-side services — never exposed to third parties or client-side code, and never written to any database or log.

API authentication uses bcrypt-hashed API keys. Raw keys are displayed only once at creation. All inter-service communication occurs within an isolated Docker network. Database ports are not exposed to the public internet.

11 Discord Terms of Service Compliance

Message Content Intent is used only to compute msg_length (character count). Message text is never stored or transmitted. Server Members Intent is used to collect guild join and departure events. Presence Intent is used to collect status change events. All three privileged intents are disclosed in the bot's Discord Developer Portal entry.

When Gait is removed from a Discord server, the bot immediately purges all behavioral_events, account_features, alerts, and guild_settings records for that server. GIIDs with cross-server history retain their feature vectors for other servers they belong to.

12 Contact and Requests

To submit a data access request, deletion request, or privacy inquiry:

Gait Privacy
Email: [email protected]
Response time: within 7 days