Legal Document

Privacy Policy

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

Gait collects behavioral metadata — never message content — to score whether a Discord account is operated by a real human or an automated system. This document explains exactly what we collect, how it's anonymized, and your rights.

01 What Gait Is

Gait is a human authenticity scoring platform. It operates as a Discord bot that observes behavioral metadata — timing patterns, interaction cadence, account characteristics — to produce a probabilistic score indicating whether a Discord account is operated by a real human or an automated system (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, PLATFORM_SALT) │ — computed inside the bot process only — │ — PLATFORM_SALT never leaves the bot — user_hash (sent in API payloads, used in NATS messages) HMAC-SHA-256(user_hash, INTERNAL_SECRET) │ — computed inside the API — GIID (Gait Internal ID — stored in all databases)

Your Discord user ID is run through a one-way cryptographic function twice before anything is stored. The result (the GIID) cannot be reversed to reveal the original user ID — not by Gait staff, not through a database breach.

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 of 50 data points must be collected before a score is computed. 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.

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

Guild admins can trigger a full erasure for a user via DELETE /v1/data-rights/erase. This permanently deletes all records for that GIID across both databases. Because GIIDs are one-way HMAC hashes, deletion is irreversible. If you remain in Gait-monitored servers, fresh signals will be collected and a new GIID will be derived, beginning a new scoring history.

Right to object / opt out

There is no technical mechanism for individual users to opt out while remaining a member of a Gait-monitored server. Opting out requires leaving the server or requesting that the server admin remove Gait.

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 portalOpen — requests via guild admin or Gait contact
Individual opt-out while staying in serverBy design — server admin is the data controller
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 platform salt used in hashing is stored only in the bot's runtime environment and is 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:

[PLACEHOLDER — operator contact name]
Email: [PLACEHOLDER — [email protected]]
Response time: [PLACEHOLDER — e.g., within 30 days]