The rule is the product.
Firm-level only. Every signal cites a public URL and a date. No personal data is ever requested, stored or inferred. This page says what that means in practice, where its edges are, and what we do not claim.
This page describes the service as it runs on 2026-10-12.
Firm-level only
A signal is about a company: its domain, what its own pages and DNS records show, and a public date. No name, title, email address, phone number or profile URL is collected, extracted, inferred, logged, labelled, exported or placed in a test fixture. There is no person-level table anywhere in the system. The person stage, finding whom to write to, belongs to whoever uses the output, under their own lawful basis.
This is enforced in code, not by intent. A firm row that carries an email, a phone number or a profile link cannot be written. A signal cannot be written without a public URL, or with a quote that is not a verbatim substring of the page it cites. A sentence that carries an email address, a phone number, a LinkedIn link, or a person’s name beside a title is withheld from any model and cannot become a signal.
Personal data: incidental only
One honest exception, decided on 2026-10-07 and written down. To re-verify a signal later, Signalkeen keeps a saved copy of each page it read, whole. A public page can carry names, titles, phone numbers or email addresses, for example a Team or Contact page, and the saved copy then holds them too. Nothing reads them out. They are not extracted, inferred, logged, labelled, put in a signal or exported. There is no deliberate collection of anyone’s details.
What is kept, and for how long
- Saved pages (the fetch cache)
- 90 days.
- Evidence copies behind a signal
- For as long as the signal is open, and for one year after it stops being open.
- The signal itself: quote, URL, dates, confidence
- Kept. An expired signal is marked expired, not deleted; the history is the audit trail.
- The crawl log: what was requested, when, and the answer
- 18 months.
- Anything about a person
- Nothing is retained, because nothing is collected.
How the crawler behaves
Every signal cites a public page and its date, holds no personal data, and was read from a source whose owner allows it: robots.txt honoured, no access control bypassed. The rules, as built:
- Every request identifies itself as SignalkeenBot, with a contact address and a link to its page.
- robots.txt is read as RFC 9309 describes: a group addressed to SignalkeenBot, or to any earlier name of this crawler, applies before the general one; Allow and Disallow decide by longest match; a robots.txt that cannot be reached means every page is off limits.
- At least 500 milliseconds pass between requests to one site, and a Crawl-delay of up to 60 seconds is honoured.
- A site’s sitemap chooses which pages are read. Paths are guessed only when there is no sitemap.
- A page that answers as an empty JavaScript shell is rendered in a browser under the same identity and pace. A page that refused us is never rendered.
- A bot challenge, a 403, a login wall or a robots.txt rule is the owner’s refusal. It is recorded. It is never solved, disguised, proxied around, replayed through an internal API, or read through an archive instead.
- Nothing on LinkedIn is read, ever.
Sources are allow-listed per detector. Each detector declares the hosts it may read, and a request outside that list is refused before it is made. A firm’s own site and DNS; the vendors’ own pricing pages named in a pack; the public posting APIs of five job boards; and an open web archive, only to date when something first appeared on a firm’s own page. There is no generic crawler.
Our crawler’s page →How to be excluded
Either of these works, and neither needs a reason. Email crawler@signalkeen.com and name the domain; within five working days we stop all requests to that domain and its subdomains, delete the pages we saved from it, stop passing on anything we learned about it, and reply to confirm. Or add a robots.txt group for SignalkeenBot with Disallow: /, which takes effect at the next visit.
A request is recorded as a domain, a date and a reason in words, never as a sender’s name or address. A listed domain is never requested again, by any part of the system, and nothing about it is exported.
The full wording of the promise →The language-model step
One kind of signal, stated plans, uses a language model to tell a sentence about the future from one about the past or present. That is the only place a model is used. The provider must be hosted in the United States or the European Union, and no page text goes to any provider outside those regions. A sentence that carries personal data is dropped before anything is sent. The stored quote is always the page’s own sentence, never the model’s wording. Signalkeen trains no model on anything. The current provider list is available on request for a data-protection review.
What we do not claim
We hold no third-party certification and claim none. We do not promise that every signal is right; we promise that every signal cites its page, and its confidence says how much weight to put on it. We do not see everything: honouring refusals means a vendor that bypasses them will always see more sites than we do. If you ask us a direct question about any of this, you get a direct answer, including “we don’t do that.”
Questions
Data-protection reviews, questions about a specific source, or a request we have not thought of: write to us. We would rather answer precisely than have you guess.
Contact us