PORTFOLEO.AI Sign in
Privacy policy

Privacy Policy

Written against the system that actually exists: the tables, the columns and the retention jobs. It is longer than a template because a template would have to be vague, and vague is what you write when you do not know what your own software stores.

Status DRAFT Drafted 2026-07-26 Effective [NOT YET IN FORCE]

01Who we are

02What we collect, exactly

Grouped by where it lives. Everything in the “Hosted product” group exists only once the hosted product opens and you create an account.

This website, portfoleo.ai

Hosted product, app.portfoleo.ai

Account
Email address and its normalised form, a password hash (Argon2id — we never store the password), email-verification timestamps, two-factor secret reference and hashed recovery codes if you enable it, failed-login counter, lockout timestamp, last login time.
Organisation
Name, slug, plan, seat count, founding seat number if any, region, creation and deletion timestamps, and your role within it.
Sessions
A hash of the session token (never the token), a hash of the request-forgery token, the first address the session was seen from, a hash of the user-agent string, and creation, last-seen and expiry timestamps. Sessions are server-side records so that revoking one takes effect at once.
Billing
Provider customer and subscription identifiers, plan, interval, status, amount, currency, period end, cancellation and refund timestamps. No card number, no expiry, no security code and no bank detail ever reaches us — the merchant of record holds all of that.
Your keys
For each credential you connect: its name from a fixed list, the encrypted value, a truncated cryptographic fingerprint, the last four characters as a display hint, and the time it was last used. The plaintext is never returned by any endpoint and never appears in a log.
Your content
Preferences and workspace layouts, watchlists, saved backtest runs and their artifacts, alert rules and fired alerts, copilot sessions and their turns and your feedback on them, workflow definitions and runs, simulated portfolios and their positions and paper orders, documents you add to your private retrieval corpus, and an activity log of what happened in your organisation.
Usage and metering
Counters per organisation and window, such as copilot queries per day and backtest minutes per day, plus rate-limit buckets. Model spend is recorded as tokens and cost with a flag for whether it ran on your key or ours.
Security audit
Login success and failure, key writes and reads, plan changes, session revocation and organisation deletion, each with actor, target, address and time. Metadata carries fingerprints; it never carries a secret value.
Support correspondence
What you write to us and what we write back.
Application logs
Operational logs with a redaction filter on the root logger. Query strings are omitted from access logs, and known credential shapes and in-flight secret values are scrubbed before a record is written.
Special categories

We do not ask for and do not want any special-category data under the GDPR, or any sensitive personal information under the CCPA as amended: no government identifiers, no health data, no biometrics, no precise geolocation, no racial, political, religious, union or sexual-life data. Do not put any of it into the product. Your positions and research are commercially sensitive but are not a special category in law, and we treat them as confidential regardless.

03Why we process it, and on what lawful basis

GDPR Article 6 basis in the right-hand column. Where you are in a jurisdiction without an equivalent regime, the purpose column still describes exactly what happens.
Data Purpose Lawful basis
Account, organisation, sessions To create and run your account and to keep you signed in Performance of a contract
Your content, your keys To deliver the analytics you asked for and to make the provider requests you asked for Performance of a contract
Billing records To take payment, apply the right plan limits, and issue refunds Performance of a contract; legal obligation for tax records
Usage counters, rate-limit buckets To enforce published plan limits and to keep one account from degrading the service for everyone else Performance of a contract; legitimate interests
Security audit log, application logs, edge logs To detect and investigate abuse, to answer “what happened to my account”, and to fix defects Legitimate interests in the security of the service
Waiting-list email To tell you when access opens Consent, withdrawable in one reply
Support correspondence To answer you and to keep a record of what was agreed Performance of a contract; legitimate interests
Product announcement email To tell you about changes that affect you Legitimate interests for service notices; consent for anything promotional

Where we rely on legitimate interests we have considered your interests and rights against ours, and you can object — see section 8. Service notices about security, billing and material changes are not marketing and cannot be unsubscribed from while you hold an account.

04What we never do

05How long we keep things

Retention is enforced by scheduled jobs, not by intention. Where a period is still being set, it says so rather than showing a number nobody implemented.
Data Kept for Then
Session records14 days idle, 30 days absoluteExpired and removed; revocation is immediate
One-time email tokensUntil used, or their short expiryConsumed or expired
Your content, active accountWhile the account exists
Your content, after downgrade90 days over-limit, read-onlyPurged, unless you upgrade or export first
Copilot sessionsPer plan, 5 to 500 most recentOldest dropped
Encrypted keys, after you delete one30 days, inactivePurged; recoverable in that window if you deleted by mistake
Account after deletionSoft-deleted, purged within 30 daysPurged
Security audit log12 monthsPurged
Application logs[TO BE SET], target 30 daysRotated and purged
Edge request logsPer our edge provider’s defaultRotated by them
Billing and tax records7 years, or as local law requiresKept as a legal obligation, even after account deletion
Encrypted backups30 daysRotated; a deletion propagates as backups age out
Waiting-list emailUntil access opens or you ask us to remove itDeleted

Deleting your account removes it from the live system immediately and from backups as those backups rotate out within 30 days. We will not restore a deleted account from a backup in order to satisfy a later request, because that would defeat the deletion.

06Sub-processors

Everyone who can touch personal data on our behalf, what for, and where. Three rows are still undecided; each will be named here before it processes anything, and the change will appear on the changelog.

Sub-processor list as of 2026-07-26. This is the list we will keep current; if you need advance notice of additions for your own compliance process, ask and we will add you to a notification list.
Provider What it does Data it can see Region
Cloudflare DNS, edge delivery, static hosting for this website, the waiting-list store, and network-layer protection Request metadata including address and user-agent; the waiting-list email Global edge, United States configuration
Application host Runs the hosted product and its database Everything in section 2 under “Hosted product”, at rest and in memory [UNDECIDED — US]
Transactional email provider Sends verification, password reset, billing and security notices Your email address and the content of those messages [UNDECIDED]
Merchant of record Takes payment, calculates and remits tax, hosts the billing portal, issues invoices Your billing identity and payment instrument — which they hold, and we do not [UNDECIDED]
Model provider Answers copilot requests when you use the included quota on the hosted tier The prompt you wrote and the figures the engine computed for it United States
Your own providers Whatever you connect a key for — market data, models, webhooks Whatever those requests contain, under your agreement with them Theirs
Error tracking Records exceptions so defects get fixed Stack traces and request context, with the redaction filter applied to its transport [UNDECIDED]
The model-provider row is the one to read twice

If you connect your own model key, requests go to that provider under your account and their policy for your account governs. If you use the included quota on the hosted tier, requests go under ours. If you run the desktop build against a local model, no request leaves your machine and there is no row here at all. The full breakdown is on the security page.

07International transfers

08Your rights, and how to use them

09Cookies

Session
An opaque random value that identifies your server-side session record. Necessary to stay signed in. Lifetime up to 14 days idle and 30 days absolute; cleared on sign-out.
Request-forgery token
A random value that the page reads and sends back on state-changing requests, bound to your session record. Necessary to prevent another site acting as you. Same lifetime.

No analytics cookie, no advertising cookie, no third-party cookie, no local-storage identifier used for tracking. The product does use local browser storage for things you would expect to be local, such as your drawing layer on a chart and your scratchpad notes; that data stays in your browser.

10How we protect it

11Children

12Changes to this policy

13Contact