← Back to Legal overview

Subprocessors

Effective August 17, 2026

This is the current, itemized list of every third party that AgentBrowser customer or prospect data actually flows through, built directly from the code and production configuration — not a generic vendor list. We list only what we verified is actually in use. If a service is built and supported but not enabled in production, that's stated explicitly rather than implied as live.

SubprocessorRoleWhat flows through itVerified from
DigitalOcean Infrastructure hosting Everything: the control-plane database (self-hosted PostgreSQL, not a managed DB product), all customer account/workspace/artifact data on local disk, the render-node fleet that runs actual hosted browser sessions. Two droplets: a control plane and a dedicated render node. Internal infrastructure audit, August 2026
Cloudflare (Tunnel) Network transport Routes all public HTTPS traffic to the control plane; sees encrypted traffic in transit, does not store customer data. Internal infrastructure audit, August 2026
Cloudflare (Pages + Pages Functions) Marketing site hosting, waitlist signup Serves the static marketing site (getagentbrowser.com, no product data). The signup form handler (functions/api/signup.js) stores email address, IP address, user-agent string, country, and timestamp for early-access waitlist signups in Cloudflare Workers KV. wrangler.toml, functions/api/signup.js (read in full)
Cloudflare R2 Object storage for artifacts (recordings, downloads) Built and supported, but not enabled in production todaybuildArtifactStore requires four R2_* environment variables and production's server.env has none set as of this writing. If an operator enables it, session recordings and other artifact bytes would be stored there instead of local disk. Listed here for completeness/forward accuracy, not because it's currently live. Internal infrastructure audit, August 2026; internal/artifacts/r2.go
Stripe Payment processing, subscription billing Built and integrated, but not configured in production today (STRIPE_SECRET_KEY unset in production; GET /api/plans on the live site returns "billing_enabled":false, confirmed against production 2026-08-17) — no paid-plan checkout can be started and no billing data is flowing to Stripe from production right now. If an operator configures it: card details (collected directly by Stripe via hosted Checkout — never touch our servers), billing email, subscription/plan state. We would store your billing email and Stripe's own customer/subscription identifiers, not payment instrument data. internal/billing/billing.go, cmd/gb-server/billing.go (Configured()/billing_enabled)
Google / Firebase (Cloud Messaging, FCM) Android push notification delivery Device push token, notification content (e.g. a vault-approval-request notification), delivered via a Firebase service-account credential. This is the only Google/GCP service used by the product — there is a standing constraint that nothing else runs on GCP, and that was checked, not assumed. internal/push/fcm.go
Apple (APNs) iOS push notification delivery Device push token, notification content, delivered via a token-based (ES256 JWT) APNs credential. internal/push/apns.go
SMTP relay (operator-configured, no default provider) Transactional email (account verification, password reset) Recipient email address, transactional message content. Optional — if SMTP_HOST is unset, the mailer reports itself disabled and sends nothing; there is no hardcoded default provider in the code, only a documented example (SMTP_FROM=AgentBrowser <[email protected]>). Whichever SMTP relay the operator configures in production is the real subprocessor for this row — confirm which one is actually configured before treating a specific vendor name as accurate here. internal/mailer/mailer.go; internal infrastructure audit, August 2026

Explicitly not a subprocessor

Your own configured destinations are not subprocessors

Webhook URLs you configure receive event data about your own workspace, at a destination you control — see the Privacy Policy §4. That's a data flow you set up, not a vendor relationship we entered on your behalf.

Keeping this accurate

This list should be re-verified whenever a new external service is wired into the product (a new env var reaching a third-party API, a new managed dependency) — the standard here is “grep the code and confirm,” not “ask what we intended to use.” If R2_* variables are ever set in production, or a specific SMTP provider is locked in, this document should be updated in the same change that does it.

This is enforced, not just requested: scripts/subprocessors-check.sh (wired into scripts/ci.sh and cloudbuild.yaml as the subprocessors step, GoodQA #38) parses the two machine-checked blocks out of docs/legal/subprocessors.md — the actual enforced source document — and fails the build if internal/, cmd/, or functions/ Go/JS source references an https:// domain or a *_KEY/*_SECRET/*_TOKEN-suffixed env var that isn't listed there. Adding a new outbound integration without adding it to the relevant block (and, if it's a real new vendor, a new subprocessor row above) fails CI loudly rather than passing silently. Scope is deliberately internal/, cmd/, functions/ only — those are the trees that can carry customer/prospect data through a third-party call, matching this doc's own definition above; website/ (static marketing links) and scripts/ (build/ops tooling) are excluded. The blocks below are a manually-synced mirror of docs/legal/subprocessors.md's blocks, not independently parsed by the CI gate — the domains block is additionally cross-checked against the source document by scripts/subprocessors-check.sh and by website/subprocessors-domains.test.mjs so drift between the two copies fails loud.

Known outbound domains (a leading *. entry matches any subdomain):

api.stripe.com                  # Stripe -- internal/billing/billing.go
api.push.apple.com              # Apple APNs, production -- internal/push/apns.go
api.sandbox.push.apple.com      # Apple APNs, sandbox -- internal/push/apns.go
fcm.googleapis.com               # Google/Firebase FCM -- internal/push/fcm.go
oauth2.googleapis.com            # Google/Firebase FCM OAuth token exchange -- internal/push/fcm.go
www.googleapis.com               # Google/Firebase FCM API -- internal/push/fcm.go
127.0.0.1                        # loopback -- self, every local service-to-service call
localhost                        # loopback alias -- internal/oidcverify
app.getagentbrowser.com          # our own product hostname, not a third party
getagentbrowser.com              # our own apex/marketing domain (the /legal pages), not a third party -- cmd/gb-server console.go's Settings-view legal link
cdp.gb.internal                  # internal-only synthetic hostname -- internal/cdp/wsconn.go, never dialed externally
prometheus.io                    # doc-comment link only (metrics format reference) -- internal/platform/obs.go, not an outbound call
example.com                      # placeholder text in UI/help copy, not a real destination
api.example.com                  # placeholder text -- cmd/gb-exp, cmd/gb-mcp
app.example.com                  # placeholder text -- cmd/gb-server console, internal/vault doc comment
your-app.com                     # placeholder text -- cmd/gb-server console webhook-URL hint
your-idp.com                     # placeholder text -- cmd/gb-server console SSO-issuer hint

Known secret-like env vars (*_KEY/*_SECRET/*_TOKEN suffix, which also covers *_API_KEY):

STRIPE_SECRET_KEY                # Stripe -- already a subprocessor row above
STRIPE_WEBHOOK_SECRET             # Stripe -- already a subprocessor row above
AUTH_TOKEN_SECRET                 # internal-only HMAC key (email-verify/reset/invite/watch tokens), never sent to a third party
KMS_MASTER_KEY                    # internal-only, sealed at rest, never leaves the process
KMS_SIGNING_KEY                   # internal-only, gb-kmsd signing key
KMS_TOKEN                         # internal-only, gb-server<->gb-kmsd bearer auth
GB_NODE_TLS_KEY                   # internal-only, gb-noded's own TLS listener key
R2_SECRET_ACCESS_KEY              # Cloudflare R2 -- already covered by the Cloudflare R2 subprocessor row above
MCP_JWT_SIGNING_KEY                # internal-only, gb-mcp session JWT signing key

A Data Processing Addendum naming these subprocessors formally is available on request for enterprise customers who need one for procurement — contact [email protected].

← Back to Legal overview