Skip to main content
A self-hosted install sends LangWatch one usage report a day, and a licensed install with hosted services also syncs its license once a day. Both carry counts and metadata. Neither carries a trace, a prompt, a dataset row, an evaluation input or output, a project name, a user name, an email address, an IP address or a key. Two hosted services do carry content: Instant Evals and managed models. They run only when the license names them, and an administrator can switch either off. Calls to third parties that libraries inside the images would make on their own (a Cloudflare tunnel, Prisma’s version check, RAGAS analytics, price list and tokenizer downloads) are off by default. See Third-party calls that are off by default. This page lists every outbound connection the install can make, what each carries, and which switch stops it. You can read the exact usage report on Settings, Checkup.

Every outbound connection

The tables below cover every component of the langwatch Helm chart: the App, the Workers, the AI Gateway, NLP, LangEvals and the Langy agent. Connections to LangWatch use HTTPS on port 443. Services you configure use the protocol and port you give them, for example SMTP for email. The chart ships a NetworkPolicy for the Langy agent only, and the AI Gateway’s NetworkPolicy is off by default. To enforce this list, use an egress firewall or your own NetworkPolicies.

To LangWatch

The license token is a hash of the license key, not the key itself. The instance id is minted once into the install’s own database. LANGWATCH_CONNECT_DISABLED=true (Helm: app.connect.disabled: true) stops every row in this table, including the usage report. With it set the install builds no client and opens no connection to LangWatch for any reason. Behind a forward proxy, set HTTPS_PROXY on the App and the Workers and the install sends these through it.

Without a hosted-service license

An install with no license, or with a pasted offline license that names no hosted service (no connectServices), sends only the usage report on its own. It runs no license sync, no Instant Evals call and no managed models slot. Two calls can still happen on an explicit user action. Running the reach checks on Settings, Checkup sends a HEAD to both LangWatch hosts. Redeeming an activation code calls /v1/license/activate. LANGWATCH_CONNECT_DISABLED=true stops both. With a license that names hosted services, the install also runs the daily license sync, and each service the license names is on until an admin switches it off on Settings, Connect.

To services you configure

Presidio runs inside LangEvals, in the cluster. Strict PII redaction stays in the cluster unless the Google DLP fallback above is set up.

Third-party calls that are off by default

Libraries inside the images can call third parties on their own. A self-hosted install switches each of these off by default: the code, the images and the npx @langwatch/server launcher set the defaults below, and the Helm chart sets them again in a ConfigMap. The images carry the tokenizer files and the model prices they need. Emails the install sends embed the LangWatch logo from app.langwatch.ai, so the recipient’s mail client loads it when it shows images. The chart keeps these defaults in one ConfigMap that each workload lists first in envFrom. A variable you set in a component’s extraEnvs, or in a Secret or ConfigMap you add through extraEnvFrom, overrides it. The Workers do not read app.extraEnvs. For example, to run phone calls through the tunnel and stop every call to LangWatch:

Hosted services that carry content

Both services run only when three things hold: the license names the service, no administrator switched it off for the organization on Settings, Connect, and LANGWATCH_CONNECT_DISABLED is not set.

Instant Evals

Instant Evals judge rows of an LWQL query or a trace search with a hosted model. The App or the Workers send the text being judged (a rendered trace or conversation) and the questions to gateway.langwatch.ai/v1/instant-evals/classify. Trace search also sends a typed sentence, the active query and the field list, to route the sentence to a filter. A self-hosted install never judges with a key of its own, so no Instant Evals call goes anywhere else. INSTANT_EVAL_CLASSIFIER=null turns the judge off entirely.

Managed models

When the license names managed_models and no administrator switched it off, the App adds one extra provider slot to every virtual key of the organization in the in-cluster AI Gateway. The slot points at https://gateway.langwatch.ai/v1 and authenticates with the license token and the instance id. It comes after the organization’s own providers. The gateway sends the whole request (messages, tools, attachments) to that slot, and the response comes back through it. LangWatch serves it with model providers it holds keys for and meters it against the organization’s budget. A request reaches the slot only when the caller names a langwatch/<model> model, for example langwatch/gpt-5-mini. A bare model name, with no provider prefix, never reaches the slot. It is served by the organization’s own providers, or refused with model_not_recognized when the slot is the only provider. A model with another provider prefix, for example openai/gpt-5-mini, stays with that provider, and its retries never fall back to the slot. To remove the slot, switch managed models off on Settings, Connect, or set LANGWATCH_CONNECT_DISABLED=true for the whole install.

The usage report and the license sync

The two are separate on purpose. The usage report is optional and says so; the license sync is a contract term and says that.

What the usage report is for

The report tells LangWatch that your install exists, which release it runs, how far it got in setting up, and how much it is used. That is what decides which installation path gets attention, which release an upgrade notice reaches, and who to contact when a version you run has a problem. The company running the install is reported as email domains with counts, for example acme.com: 14. Never an address, never a name. The domain is the one field that says who you are, and it is the first one to switch off if you would rather it did not.

Read your own copy

Open Settings, Checkup and scroll to What this install sends to LangWatch. The section shows the report your install would send right now, pretty printed, with a copy button and the host it goes to. What you read there is what leaves the install, not a description of it. From a terminal, langwatch doctor prints the same report after the checkup rows:
The CLI needs a project API key of the install, either from langwatch login or in LANGWATCH_API_KEY, with LANGWATCH_ENDPOINT pointing at your install.

The three switches

LANGWATCH_CONNECT_DISABLED=true is a fourth switch, for an audit that has to prove absence rather than derive it from the license. With it set the install opens no connection to LangWatch for any reason, see To LangWatch. The switches on the Checkup page are stored in the install’s own database, so they hold across restarts, upgrades and every browser. Organization management rights are needed to change them; every member can read the report.

When the report starts

The first report goes out at the next 12:00 UTC after boot, and one a day after that.

What is never collected

The dictionary page keeps the exact list. In short: no trace or span content, no prompts, no dataset contents, no evaluation inputs or outputs, no project names, no user names, no email addresses, no IP addresses, no keys of any kind.

Where it lands

The report lands in a database at LangWatch, one row per install and one per report, where the LangWatch team reads it. LangWatch also sends the report to PostHog for analysis and updates the account’s traits in Customer.io, both under a data processing agreement. No other party receives it.

Existing installs

An install on an offline license, upgraded to a release with this page, behaves as before: the same seat cap, the same screens, the same license check with no network on the path, and the usage report going where it always went. The report gains fields with the release, and the switches above are how to trim it. An upgraded install also takes the off-by-default settings on this page. A worker that ran voice phone calls through the Cloudflare quick tunnel now needs VOICE_TUNNEL=true, or VOICE_PUBLIC_BASE_URL set to your own hostname.
Last modified on October 12, 2026