Privacy
Last updated: 2026-10-14
A file is held until its upload handle or download link expires (60 minutes; an edit session up to 4 hours). No debugging copy is kept; logs and error reports carry no file contents; no training use.
This document covers how xlsx-for-ai handles your data. It is written for developers who want to audit the data flow before deploying xlsx-for-ai in an agent, and for FP&A teams who need to forward it to legal before using an agent that touches financial spreadsheets.
Architecture
xlsx-for-ai is a thin npm client over a hosted API. When your agent calls a tool (e.g., xlsx_read), the client reads the file from disk, encodes it as base64, and sends it to the xlsx-for-ai API over HTTPS. Processing happens in memory on the server. The result is returned to your agent.
This means: workbook bytes leave your machine and travel to our server for every non-fallback tool call. If that is not acceptable for your threat model, use the offline fallback described below.
What we send
For every tool call, the client sends:
- File bytes (base64-encoded) — the xlsx file your agent asked to process.
- Anonymous client_id — a UUID generated locally on first run. Not linked to an email address, name, or any identifying information.
- Platform and version — e.g.,
darwin-arm64,2.0.0. Used for compatibility telemetry. - Tool name and options — which tool you called and the parameters you passed (sheet name, format, etc.).
We do not send or collect:
- Cell content beyond what is in the file bytes during the request (the bytes are held only as the temporary copies described below).
- File metadata beyond size and sheet count, which are captured for telemetry.
- File names or paths — the client sends bytes only; the local path never leaves your machine.
What happens to the file bytes
File bytes are processed in memory for your request. The only copies of your file are the short-lived ones below, each of which expires automatically when its time runs out. No workbook is captured for debugging or any other purpose, whether a request succeeds or fails.
| Temporary copy | When it exists | Expires after |
|---|---|---|
| Upload handle | You upload a file through the one-time upload page or upload link (the link itself works for 30 minutes) | 60 minutes |
| Download link | A tool produces a file for you to fetch. A link serves only the account that produced it. | 60 minutes |
| Edit session | You open a workbook edit session | 30 minutes after its last use, and never more than 4 hours |
| API cache handle | An API caller uploads a workbook once to reuse it across calls | 60 minutes by default; at most 24 hours if the caller asks |
| In-memory parse cache | A repeat call on the same file within minutes | 5 minutes, held in memory only |
When the account's consent level is none or the request carries X-XFA-Privacy: strict, no download copy is kept and no download link is issued, cache handles are cut to 60 seconds, and the in-memory parse cache is skipped. Use the CLI flag --privacy=strict to add this header to every request from a CLI session, or set the environment variable XFA_PRIVACY=strict.
No capture. We do not keep copies of workbooks, redacted or not, when a request fails or succeeds. Error reports sent to our error tracker carry the error type and our own code's stack trace, never the error message text, because that text could contain values from your file.
No training. Your files and their contents are not used to train models.
When part of a file goes to an AI model. A few tools ask an AI model (Anthropic's Claude API) for help, and send it only the part of the file that job needs:
xlsx_pii_scanandxlsx_redactsend short candidate text strings from the file, to find names and addresses.- The Shopify import tools and the import converter send the column headers and a few sample values from each column, to match columns to the target format.
No other tool sends file contents to anyone. Tools you point at a destination, such as xlsx_post_slack or xlsx_post_teams, send what you ask them to send.
Audit log: we log the following per request: timestamp, client_id, endpoint, file size (bytes), sheet count, structural fingerprints (formula count, sheet dimensions, built-in function names, feature flags like "uses_LAMBDA"), error class and error literal type (if any, for example #DIV/0!), latency, and which hardening checks ran. We do not log cell values, formula text, row data, file names, or any representation of workbook content.
No local fallback
The client has no local parsing path. Every tool, including xlsx_read, sends the file to the API for processing. If the API is unreachable, the call fails with an error rather than reading the file on your machine.
Anonymous UUID registration
On first run, the client generates a UUID locally and sends it to POST /api/v1/clients with your platform and client version. The server returns an opaque API key. Both are stored in ~/.xlsx-for-ai/config.json.
The UUID is anonymous by design. We do not ask for a phone number or any other identifying information beyond the email address used for sign-in. The UUID is a random identifier — it cannot be traced back to you without your cooperation.
To delete your registration: remove the config file.
rm ~/.xlsx-for-ai/config.json
The next tool call will generate a new UUID and register a new client. Your previous usage history (audit log entries) will remain associated with the old UUID, but the old UUID cannot be linked to the new one or to you.
Telemetry
Telemetry is opt-in and disabled by default. When enabled, we capture aggregate usage signals (call counts, error rates, file size distributions) tied to your client_id. No workbook content is captured in telemetry.
xlsx-for-ai --enable-telemetry # opt in
xlsx-for-ai --disable-telemetry # opt out (default)
xlsx-for-ai --telemetry-status # check current setting
The telemetry setting is stored in ~/.xlsx-for-ai/config.json under the telemetry key. It persists across upgrades.
Audit log retention
Server-side audit logs (request metadata, not workbook content) are retained for 90 days, then deleted. This is our current policy; we will update this document if the retention period changes.
Consent level
Workbook capture is off for every account, whatever its consent level. The consent level now controls one thing. Setting it to none through PATCH /api/v1/clients/me/consent is the same as sending X-XFA-Privacy: strict on every request: no download copies, 60-second cache handles, and no in-memory parse cache.
Compliance posture
SOC 2: not yet certified. We operate with SOC 2-aligned controls (access logging, least-privilege service accounts, encrypted storage at rest, TLS in transit) and are working toward formal certification.
GDPR: we do not collect personally identifiable information. The client_id UUID is not linked to any natural person. If you believe a UUID is linked to you and want it deleted from our audit logs, contact us at the address below and we will delete all records for that client_id within 30 days.
HIPAA / PCI: xlsx-for-ai is not HIPAA- or PCI-certified. Do not use it to process protected health information or payment card data in regulated environments without additional controls.
Data deletion requests
To request deletion of your audit log records: email hello@xlsx-for-ai.dev with your client_id (found in ~/.xlsx-for-ai/config.json) and "privacy request" in the subject line. We will delete all audit log entries for that client_id within 30 days and confirm by reply.
Changes to this document
Material changes will be noted in the project changelog with the date they take effect.