← ∆ voicehook.ai

Privacy Policy

Last updated: 10 October 2026 · Deutsche Fassung

This is an English translation of our German privacy policy (Datenschutzerklärung). In case of discrepancies, the German version prevails.

1. Controller

Oliver Spitzkat
Am Lindenbusch 22
50354 Hürth
Germany

Email, also for data protection requests: support@voicehook.ai

2. Overview

voicehook.ai is a voice call in your browser. You talk to a voice bot whose answers come either from an AI language model or from an AI agent you invite. You can use a free allowance without signing in. For paid usage you top up a balance; for this there is an account, to which your email address is optionally linked. Our pages set no cookies for visitors and embed no analytics, tracking or advertising services.

3. Hosting

The website, the application programming interface (API), the databases and the voice server run on our own server at Hetzner Online GmbH, Industriestr. 25, 91710 Gunzenhausen, Germany, in the Nuremberg data center, Germany. Hetzner processes the data as a processor.

4. Server logs

When you visit voicehook.ai, the web server (Caddy) logs every request with:

  • IP address,
  • date and time,
  • requested address including parameters; secret parameters such as invite codes and access tokens are masked before writing,
  • HTTP status code and amount of data transferred,
  • headers sent by the browser, such as browser type (user agent) and referrer.

In addition, the application server and the voice service log technical events: room name, participant identifiers, start, end and duration of a call, booking and error messages. We do not log call content: neither what you say nor what the bot or an invited agent says, only technical details such as length, time and state of an utterance.

For our reach statistics we count per day, campaign source and step (page view, call started, invite copied, AI joined, call of one minute or longer, sign-in, top-up, another call on a later day). The open page keeps the campaign source (utm_source and utm_campaign from the link) only in memory; it is not stored in your browser. For calls via an invite link or a call link created by an AI agent, the type of link counts as the source; without a campaign source the source is "direct". When a room is created, the page sends the source once, and the server stores it as a label for the room name (room name, source, campaign, time; separate table room_source in funnel.sqlite, not in the cost record), without IP address, account or device identifier. Whether an invite was copied or an AI joined in this room is also noted for the room. The server assigns the remaining steps only via the room name: call of one minute or longer and sign-in from the cost record (section 7.1), top-up from the bookings of the account linked to this room. This assignment is pseudonymous, not anonymous, because the bookings of an account can be reached via the room. However, only totals per day, source and step are evaluated and output; the statistics do not link the steps to your person and contain no IP addresses and no identifiers of your device. Whether someone comes back is evaluated only for signed-in accounts, based on the call bookings that are stored anyway; this too results only in totals. Like every request, the counting requests appear in the server log for at most 7 days, without the content of the request. We delete labels and notes for a room after 35 days and the daily counters without personal reference after 25 months (section 14). Legal basis: Art. 6(1)(f) GDPR (legitimate interest in measuring reach without tracking).

Purpose: operation, troubleshooting and prevention of abuse. Legal basis: Art. 6(1)(f) GDPR (legitimate interest in a secure and working service).

To prevent abuse, the server keeps the IP address in memory for up to 10 minutes when a call is started (at most 5 call starts per 10 minutes and IP address). This list is not written to disk.

5. Voice call

5.1 Connection

Audio is transmitted in real time via WebRTC through a self-hosted LiveKit server on our server in Nuremberg (rtc.voicehook.ai). We do not record calls. To join, the server issues an access token that expires after one hour by default. Invite links are bound to one room and also expire. The call ends when nobody is left in the room or the balance is used up. The room is then deleted.

5.2 Speech recognition (Deepgram)

So that the bot can understand you, your microphone audio is sent to Deepgram, Inc. (USA) for speech recognition. A voice filter on our server only sends segments in which speech was detected; silence is not sent.

5.3 Language model (Google Gemini)

In normal mode, Google's Gemini API receives the recognized text of the conversation and the instructions for the bot in order to generate answers. In live mode, your audio is sent directly to Gemini Live (Google), which handles speech recognition, the answer and speech output in one step.

5.4 Speech output (Google Cloud Text-to-Speech)

The sentences the bot speaks are converted into audio by Google Cloud Text-to-Speech. Google only receives the text to be spoken.

5.5 Transcript and invited agents

The transcript (what the bot heard and said) is sent live to the participants in the room and shown in the browser. Our code does not store transcripts or audio permanently. If you invite your own AI agent into the call (for example Claude Code or Codex), this agent receives the transcripts. We are not responsible for the processing by your agent and its provider.

Legal basis for the processing during the call: Art. 6(1)(b) GDPR (providing the service you started).

5.6 Invited agents via HTTPS (bridge)

An invited agent joins the call either directly via WebRTC (for example with the command line tool voicehook-agent) or via our HTTPS interface (/api/bridge/*), for example when it runs in a cloud environment without WebRTC. When an agent joins via HTTPS, our server holds the connection to the room on the agent's behalf. It forwards the transcript, the sentences of other participants and events in the room (who joins, who is speaking) to the agent via HTTPS, and passes the sentences the agent wants spoken on to the bot. The server keeps this content in memory only, for as long as the session runs.

For each join, the server issues a random session key that is valid for this one room only. The server stores only a SHA-256 hash of it. The key expires when the call ends or the agent leaves the room, and also after a period of inactivity (10 minutes by default; the agent can set this to up to 60 minutes or switch it off). So that a running session survives a restart of our server, we store the following per session in a database on our server (bridge.sqlite): room name, participant identifier, the agent's IP address, the name and model stated by the agent, the requested voice, the user's name if the agent sends it, and the times of start, last activity and end. We do not store invites, persona texts or transcripts there. The entry is deleted no later than 5 minutes after the session ends. When the agent joins, the server logs the room name, participant identifier and the agent's IP address (see section 4).

You decide which agent you invite; it is operated by you or by a provider of your choice. We are not responsible for the processing by your agent and its provider (see 5.5). Legal basis: Art. 6(1)(b) GDPR.

5.7 Call language

The site and the call are available in German and in English. Your browser stores your choice locally (see section 11). When a room is created, the server records the language as a property of the room (room metadata on our LiveKit server) so that the bot and invited agents use the same language; invite links to English rooms carry the addition lang=en. This setting belongs to the room, not to a person, and disappears with the room. The label with the campaign source, by contrast, is stored by the server separately from the room (see sections 4 and 14).

6. Free allowance

Without a balance, there is a limited free allowance per day. To attribute it, we use a random identifier that your browser creates in local storage (anon-id) and your IP address (for IPv6, the /64 network); if you are signed in, also the internal identifier of your account, so that the allowance applies once per account and day. Of these, we only store SHA-256 hash values, never the identifier or the IP address in plain text. We compute the hash of the IP address with a secret key that changes daily and is not stored anywhere, so hash values from different days cannot be linked. In addition, we store the day, mode, usage and the room name. These entries are deleted automatically after 7 days.

Legal basis: Art. 6(1)(b) GDPR (providing the free offer) and (f) (legitimate interest in preventing abuse of the free offer).

7. Balance and account

When you top up a balance, the server creates an account and gives your browser a secret wallet token, which is kept in your browser's local storage. The server stores only a SHA-256 hash of it. In the account database (billing.sqlite) we store:

  • account ID, email address (from the payment or the sign-in) and whether it is verified,
  • balance and outstanding amounts,
  • bookings: top-ups (Stripe session and payment ID, amount, time), refunds and chargebacks, as well as the usage per call (room name, mode, cost, time),
  • which account pays for a room,
  • optionally a name you enter in your account yourself (at most 22 characters). In calls you start or join while signed in it is transmitted to all participants and appears as your name to Delta (also as context for the language model, see 5.3), to the connected agents and on your decisions. You can change or delete it at any time; without a name you are shown as “Guest” in calls. It is stored as long as the account exists.

Legal basis: Art. 6(1)(b) GDPR (contract for the balance) and (c) (retention obligations under commercial and tax law for bookings).

7.1 Cost record per call

At the end of every call, the server writes an entry to a cost record (table call_ledger in billing.sqlite), also for calls using the free allowance. An entry contains:

  • room name and call identifier, mode (normal or live),
  • who pays for the call (balance, free allowance, operator or unassigned) and the account ID if the call runs on a balance or you were signed in when starting it,
  • start, end and duration as well as your speaking time (the seconds the voice filter detected as speech),
  • the quantities used from the services (seconds of speech recognition, characters of speech output, tokens of the language model), the costs calculated from them, the amounts booked (free allowance, balance) and the reason the call ended.

The record contains no transcripts, audio, email addresses or IP addresses. Purpose: billing, traceability of bookings and control of our costs. Legal basis: Art. 6(1)(b) GDPR.

7.2 Your own styles

Your browser stores your own styles (name, colour and slider values, preview image) in local storage (see section 11). If you are signed in, we also store them with your account (in billing.sqlite) so that they are available on all your devices. If you share a style, we create an unchangeable copy that anyone with the link can retrieve; your account and email address are not visible. Legal basis: Art. 6(1)(b) GDPR. Storage period: as long as the account exists.

8. Sign-in

8.1 Sign-in with an email link

If you enter your email address, we send you a sign-in link. It is sent via Resend (Resend, Inc., USA), which receives your email address and the content of the email for this purpose. The link is valid for 15 minutes and can only be used once; the server stores only a hash of it together with the email address. To prevent abuse, we limit the number of requests per IP address and email address.

8.2 Sign-in with Google or GitHub

You can also sign in with your Google or GitHub account (OAuth). You are redirected to the respective provider and sign in there. We only request your email address and only accept it if the provider reports it as verified. We store the verified email address and the identifier of your account at the provider (provider ID) with the time of the first and last sign-in. Google and GitHub are themselves responsible for the processing during sign-in on their pages.

Legal basis for the sign-in: Art. 6(1)(b) GDPR.

9. Payments (Stripe)

To top up, we redirect you to Stripe's payment page (Stripe Payments Europe, Ltd., 1 Grand Canal Street Lower, Dublin 2, Ireland). You enter your payment details (for example card details) directly at Stripe; we do not receive them. If an email address is already stored for your account, we pass it to Stripe so that it is prefilled. From Stripe we receive the email address given during payment, the amount and identifiers of the payment, as well as notifications about refunds and chargebacks. Stripe may also transfer data to the USA. Legal basis: Art. 6(1)(b) and (c) GDPR.

10. Program libraries (jsDelivr)

The call page loads the libraries livekit-client and three.js from the content delivery network jsDelivr. The CDN operator receives your IP address and browser headers. Legal basis: Art. 6(1)(f) GDPR (fast, reliable delivery).

11. Cookies and local storage

We do not set cookies for visitors. Exception: the operator's devices carry a technical cookie (vh_int) so that their requests are not counted in the statistics. Visitors never receive this cookie. Our pages store some values in your browser's local storage (localStorage). We do not store the campaign source from a link in your browser. Most of them never leave your browser; the participant identifier, anon-id, wallet token and sign-in nonce are sent to our server with the respective request. You can delete everything at any time in your browser settings.

KeyContent
vh-wallet-v1Wallet token: access to your balance
vh_login_nonceOne-time value that binds a sign-in to this browser
vh-anon-v1Random identifier for the free allowance (anon-id)
vh-free-seen-v1Whether the note about the free allowance has already been shown today
vh-seen-v1Whether you have had a call before (controls the note for first-time visitors)
vh-theme-v1Light or dark design
vh-hd-v1HD display on/off
vh-tr-mode-v1Position and display of the transcript
vh-music-state-v2Visualization settings (sliders, color palette)
vh-mode-v1Selected display mode
vh-live-mode-v1Normal mode or live mode
vh.langSelected language for the site and the call (German or English)
vh-mic-v1, vh-mic-v1-labelSelected microphone (device ID and name)
vh-id:v1:<room>Random participant identifier per room, so that reloading does not show you as a new person

A previously used key vh-recent-invites:v1 is deleted when the page is opened. Stripe's payment page and the sign-in pages of Google and GitHub may set their own cookies; the privacy notices of these providers apply to them.

12. Contact by email

Emails to addresses at voicehook.ai are forwarded to our mailbox via the forwarding service ImprovMX. We process your message only to answer it. Legal basis: Art. 6(1)(b) or (f) GDPR.

13. Recipients and transfers to third countries

RecipientPurposeLocation
Hetzner Online GmbHServer hostingGermany
Deepgram, Inc.Speech recognitionUSA
Google (Gemini API, Gemini Live, Cloud Text-to-Speech)Language model, speech outputIreland / USA
Stripe Payments Europe, Ltd.Payment processingIreland
Resend, Inc.Sending sign-in emailsUSA
Google, GitHub, Inc.Sign-in (OAuth), only if you choose itIreland / USA
jsDelivrDelivery of program librariessee operator
ImprovMXEmail forwardingsee operator

Where data is transferred to the USA or another country outside the EU, this is based on an adequacy decision of the EU Commission (for certified US companies, the EU-US Data Privacy Framework) or on standard contractual clauses of the EU Commission.

14. Storage period

We store personal data for as long as it is required for the respective purpose, and beyond that where statutory retention periods (for example for bookings) require it. Where the code sets fixed periods:

  • Audio and transcripts: not stored permanently by our code.
  • Server logs (section 4): 7 days, then deleted automatically.
  • Campaign labels on the call and step markers: 35 days. Daily counters of the reach statistics (without personal reference): 25 months.
  • Security log of the server (login attempts and administrative access with IP address): 4 weeks, to investigate attacks (Art. 6(1)(f) GDPR).
  • IP addresses for abuse prevention when starting a call: at most 10 minutes in memory.
  • Free allowance (hash values, usage): 7 days.
  • Sign-in links: valid for 15 minutes; expired links are deleted automatically during later sign-ins.
  • Access tokens: valid for 1 hour by default.
  • Sessions of agents invited via HTTPS: until the session ends, then at most 5 minutes.
  • Calls: end when nobody is left in the room or the balance is used up; the room is then deleted.
  • Account and bookings: for as long as the account exists, bookings additionally until the statutory retention periods expire.
  • Cost record per call: 13 months after the end of the call, then deleted automatically.
  • Own styles with your account and shared styles: as long as the account exists.
  • Local storage in the browser: until you delete it.

15. Your rights

Under the GDPR you have the right to:

  • access (Art. 15),
  • rectification (Art. 16),
  • erasure (Art. 17),
  • restriction of processing (Art. 18),
  • data portability (Art. 20),
  • object to processing based on Art. 6(1)(f) (Art. 21).

To exercise them, contact support@voicehook.ai.

16. Right to lodge a complaint

You can lodge a complaint with a data protection supervisory authority, in particular in the country where you live or work. The authority responsible for us is the Landesbeauftragte für Datenschutz und Informationsfreiheit Nordrhein-Westfalen (LDI NRW, the data protection authority of North Rhine-Westphalia), Kavalleriestr. 2-4, 40213 Düsseldorf, Germany.