Privacy Policy
Version 11Effective 20 September 2026
SocialPipe ("we") operates the SocialPipe API. Controller: SocialPipe. Reach us through the chat widget on every page of socialpipe.dev; it is the only contact route we operate and you do not need an account to use it. We have not appointed a data protection officer or an EU representative.
What we hold about customers
| Data | Why | Lawful basis | Retained |
|---|---|---|---|
| Account email | Identify the account, send service notices | Contract | Until erasure requested |
| API key hashes | Authenticate requests | Contract | Until the key is revoked or erasure |
| Credit ledger | Bill accurately and answer disputes | Legal obligation (financial records) | Account lifetime + 7 years |
| Usage records: endpoint, platform, credits, timestamp, and which interface the call came through | Billing and abuse detection | Contract, legitimate interest | Indefinitely |
| The parameters you sent and the response you received | Reading back your own past calls, and diagnosing a disputed response | Contract, legitimate interest | Indefinitely |
| Billing name, address, payment details | Take payment | Contract, legal obligation | Card details held by Stripe and never by us; name and address kept with the financial record |
| Copyright notices received | Comply with the DMCA | Legal obligation | 7 years |
Only a SHA-256 hash of each API key is stored, so a database disclosure does not yield working keys.
We do not write raw client IP addresses. Every API request carries a key, so rate limiting counts against the key rather than an address. One exception, from 2026-09-26: the dashboard reports its own browser errors to Sentry, and a report sent from your browser discloses your address to whoever receives it. We do not store it and Sentry is instructed not to, and no configuration undoes the connection itself.
We record which posts and accounts a customer looked up. Alongside the route and the credit count we store the identifier sent and the response returned. On most routes that identifier names a person or a specific post, so this table is also a record of who our customers research.
What we hold about people who are not customers
The API returns public post, profile, follower and comment records from the platforms in our API reference. Those records describe people who never signed up for anything. This is the most important section in this policy.
The API is a router: it asks the platform for a public record and returns that record unchanged. We do not select fields, rename them, hash them or drop them.
- A response contains whatever the platform published: typically a handle, display name, biography, profile image, creation date, and follower and engagement counts. On a timeline, the same again for any account quoted, replied to or mentioned
- We add nothing. No enrichment, no joining across sources, no inference. Everything in a response is retrievable from the platform itself without an account
- We keep two copies. A response cache, 12 hours by default and 30 days at most, which expires automatically. And the call record: we keep the parameters you sent and the response we returned, indefinitely, and it does not expire
- The customer decides what happens next. Anyone who stores this data, builds profiles from it or combines it with other sources does so on their own legal basis, and our terms bind them to that
How much of other people a capability returns
Every capability carries one of three personal-data classes, stated on that capability's own page in the API reference. We publish the rule rather than a list, because the list is 329 rows long.
| Class | What it means | Capabilities |
|---|---|---|
no-people | No person in the response at all: a music track, a hashtag, a playback URL, an id converter | 23 |
single-subject | The person in the response is the one you named, or the author of the one post you asked for | 97 |
bulk-people | A page of accounts or commenters, none of whom is the subject of your request: followers, following, reposters, repliers, and any search or feed whose results carry a different author each | 209 |
A single bulk-people call can return dozens to hundreds of people, each with a handle,
display name and profile image. Nothing is hashed, redacted or aggregated.
The rule reads the capability's own name, and where it cannot tell it assigns
bulk-people, the most protective of the three. 38 capabilities are in that class for
that reason rather than because we are confident they belong there.
The Art. 6(1)(f) balancing test for bulk retrieval
Returning one public profile and returning somebody's follower graph differ in kind, so the second is assessed separately. Adding a platform does not change this test.
- Our interest: giving a developer data the platform already publishes, through one documented interface rather than scraping infrastructure each customer maintains
- The data: public by the platform's design and the account holder's settings. A protected account's followers are not returned to us at all
- Effect on the individual: not "none". A follower list is a social graph, and social graphs support inferences a single post does not
- Safeguards: no
user_idon the cache key, so a cached record is about a public account and not about who asked; a contractual ban on profiling, ranking or scoring the individuals in a response; and no bulk route exposed through our AI-agent interface, so a bulk retrieval is always a deliberate act by a developer - Withdrawn safeguards: transient retention, and keeping no record of which identifiers a customer requested. The call store removed both on 2026-08-23. A follower page returned to a customer is now held indefinitely against that customer's name, and the effect above is correspondingly larger
- What would require revisiting this: enriching, joining across sources, or offering these routes as a monitoring or alerting product
Handles and display names in a reply thread are returned exactly as the platform published them. An earlier draft committed to hashing them; that was withdrawn before any comment data was processed under it.
If you appear in data we returned
- Access. Open the chat widget with the handle or profile URL. We search the stored responses and tell you what we hold, which calls it came from and when. We ask for enough to be confident you are the person named and no more
- Erasure. We delete every stored response containing you and null the stored parameters naming you. The billing row survives, holding the route, credit and timestamp, and no longer the identifier or payload
- Objection. The basis is legitimate interests, so you may object under Art. 21 GDPR. We stop unless we can show compelling grounds, and we tell you which happened
- Timing. Within 30 days of a request we can verify
- The limit of it. We hold what the platform published, and the platform is the controller of that record. Making an account protected stops it appearing in our responses at all, which is a more complete remedy than anything we can offer. Erasure here does not reach a copy a customer already downloaded
What we never store
Video, audio and image files. Media addresses in a response point at the platform's own network; we return the address and never fetch the file.
Automated processing
No endpoint sends your data to a language model. Nothing we operate performs automated decision-making or profiling within the meaning of Art. 22 GDPR.
Your rights
Where GDPR or UK GDPR applies you may request access, rectification, erasure, restriction, portability, or object to processing based on legitimate interests. Ask through the chat widget.
What erasure does. Every API key is revoked. Within 30 days the account record, keys and usage records are destroyed and the payment-provider link is severed. Usage records include the stored parameters and responses described above.
What survives it. Credit ledger entries and invoices are kept as financial records under a legal obligation, so they cannot be deleted on request. They are pseudonymised: the account becomes a random subject identifier and the link to any key is cut, so what remains identifies a transaction rather than a person.
You may also complain to your supervisory authority, which in the EU or UK is the data protection authority where you live.
Security
Keys are hashed, never stored in plaintext. API keys and Authorization headers are
redacted from application logs at the point of emission. Application logs are kept 7 days.
Error monitoring. A failed request sends a report to Sentry carrying the exception and line of code, the HTTP method and the route path, and not the query string naming the account or post, not the request or response body, not the headers, not the values held by the crashed code, and not the server's log lines. Each is a separate route by which the identifier could arrive, and each is switched off rather than filtered, because a handle has no pattern a filter could key on. An error report carries no account identifier.
From 2026-09-26 the dashboard reports its own errors too, and that half differs in one way: an API report is sent by our server, so the coarse location Sentry derives is a data centre, while a dashboard report is sent by your browser, so the same mechanism locates you. We configure the reporter not to record your address and never store it ourselves, and we are not going to claim that scrubbing a field unsees a connection. A dashboard report carries the error, the page, and the browser and version. Not form contents, not the query string of any API call, not your session token, and not what you were looking up.
Subprocessors
An addition is published here before it begins processing customer personal data, so you can object under Art. 28(2) GDPR first. To be notified, ask through the chat widget.
| Subprocessor | Purpose | Location |
|---|---|---|
| Railway | Hosting, Postgres and Redis: accounts, keys, credit ledger, usage records, the stored parameters and responses, response cache, application logs | US West |
| Supabase | Dashboard sign-in: account email and session tokens. Never extraction data | US |
| Cloudflare | DNS: request metadata in transit | Global edge |
| Stripe | Payments and billing. We are the seller of record; Stripe is our processor. Card numbers go straight to Stripe and never reach us | US / global |
| Sentry | Error monitoring as described above, and from 2026-09-26 the dashboard's browser errors. Kept 90 days | US |
| Crisp | Live chat: whatever you type, your address as the source of an open connection, your browser and the page, and a cookie so a reply finds the same conversation. No account email or customer identifier reaches it | EU (France) |
All of them process within the EEA, the United States, or at a global edge under its own transfer framework. There are no other transfers.
Crisp receives what you decide to type. If you paste an API key, a customer's details or an identifier you looked up, it is in a third party's system and no filtering on our side sees it first. Redact it before you send it: describe the problem without the secret, and revoke a key from the dashboard rather than quoting it to us. The widget is anonymous: we do not pass the signed-in account's email to it, because that would hand a customer identifier to another system on every dashboard page rather than only when someone starts a conversation.
Changes
Material changes are published here with a new version and effective date, and notified to account holders before they take effect. New subprocessors are published before they begin processing.
| Version | Date | Change |
|---|---|---|
| 11 | 2026-09-20 | Every email address is removed; the chat widget is now the only way to reach us. Access, erasure, objection and Art. 28(2) notice requests all run through it. Nothing about what we process, why, or how long we keep it has changed — only the channel. The warning about pasting secrets into chat now says to redact them, because the address it used to offer as the safer alternative no longer exists |
| 10 | 2026-09-20 | Shortened. Every disclosure above is unchanged in substance; what came out was commentary about earlier versions of this document, which the log below already records. No processing, retention, basis or safeguard changed |
| 9 | 2026-09-20 | The subprocessor list moves into this policy, and chat is switched on today, not 2026-10-04 as version 8 said. Same widget, same data, same anonymity: the date moves forward, so the notice period shortens from fourteen days to the same day. Recorded as a shortening rather than reissued quietly |
| 8 | 2026-09-20 | Advance notice: a Crisp chat widget runs on the website and the dashboard from 2026-10-04. The first subprocessor here receiving content a visitor wrote rather than telemetry a machine emitted: the message, the visitor's address as the source of an open connection, and a cookie. Anonymous, and not passed an account email |
| 7 | 2026-09-20 | Nine platforms are withdrawn and the surface goes from 765 capabilities to 329. Strictly less personal data is processed: the class counts fall to 23 no-people, 97 single-subject and 209 bulk-people, and the protective default falls from 65 to 38. The rule, the balancing test and every safeguard are unchanged, which is why this took effect on publication rather than on notice |
| 6 | 2026-09-13 | A correction. No bulk route exposed through our AI-agent interface was inaccurate: one of the three tools reached a capability returning people in bulk. The tool was removed rather than the sentence rewritten, and a check now fails the build if any tool reaches such a capability again. Search over the REST API is unchanged. Separately, usage records now also store which interface a call came through |
| 5 | 2026-09-12 | Advance notice: from 2026-09-26 the dashboard reports its own browser errors to Sentry. We never write raw client IP addresses keeps its place and gains its exception in the same breath: we do not record your address, and a report your browser sends still discloses it to the recipient |
| 4 | 2026-09-12 | Sentry is added as a subprocessor, published before it begins processing. Security gains a paragraph on what an error report carries and what it does not: no query string, so no record there of which account or post a failing request concerned. Separately, the route table becomes generated, and the enumeration of six people-bearing routes is replaced by the three-class rule |
| 3 | 2026-09-09 | TikTok is served alongside X. The balancing test is unchanged, because the processing operation is the same one on a second source. This section points at the API reference rather than naming platforms |
| 2 | 2026-08-23 | The call store described in version 1 as built and switched off is now on, with indefinite retention. Two safeguards in the balancing test are withdrawn: transient retention, and keeping no record of which identifiers a customer requested. Usage-record retention goes from 90 days to indefinite. If you appear in data we returned is rewritten: we can now search for you. No external legal advice was taken before the change, contrary to what version 1 said we would do |
| 1 | 2026-08-23 | Initial publication |