← Legal

The retention position the roadmap requires, stated per category rather than as a single sentence, because the answers genuinely differ.

Images

Nothing is kept. An image arrives base64-encoded in a request body, is held in memory, is forwarded to the model provider, and ceases to exist when the request ends. It is never written to disk, never written to the database, and never appears in a log line.

This is the strongest claim on this page and the one most worth being able to prove. It is enforceable by reading app/api/ai/describe/route.ts: the buffer is a local, and nothing persists it.

What the model provider keeps is their retention policy, not ours — which is why the sub-processor list matters and why the OpenRouter fallback is an open question rather than a detail.

Descriptions

Returned to the plugin and stored in the customer's own WordPress database, in their vergeml_ai_index table. We keep no copy. Deleting them is the customer's own operation on their own site.

The one exception is batch jobs: ai_job_items holds a returned description until the plugin collects it, because a batch is asynchronous and the result must survive until it is fetched.

Purged 30 days after the job finishes. The nightly /api/cron/reconcile clears alt, caption, tags and error on every item whose job has ended, failed or been cancelled and finished more than thirty days ago.

Two deliberate choices in that:

  • Thirty days from the job finishing, not from collection. A site can be offline for a fortnight, and a customer returning to find the descriptions they paid for already deleted is a worse failure than holding them a little longer.
  • A job that has not finished is never touched, however old. Its items are work already paid for and not yet collected; emptying them would take away the thing that was bought.

The job row itself survives with its image_count and credits_spent. That is our accounting, not the customer's content — the promise is that we stop holding what the model wrote about their pictures, not that we forget a job happened.

Usage and metering

credit_entries holds one row per credit movement: a licence id, an amount, a reason, a timestamp. No filename, no image, no description. It is the financial record, it is what the rate limiter counts, and it is retained for as long as the licence exists plus the statutory invoicing period.

Accounts and licences

Email, hashed password, licence keys (hashed), activated site URLs. Retained while the account exists. On deletion, removed within 30 days.

Invoices and tax records

Retained six years: Art. 30 of the Spanish Código de Comercio requires accounting records to be kept that long, and the tax limitation period is four. This is not negotiable and overrides a deletion request for those specific records. The exact figure is the accountant's to confirm; six is the conservative reading and the one stated here.

Logs

Vercel request logs hold IP addresses and request metadata for whatever their platform retains on the current plan; that figure is Vercel's to state and is not something this repository can assert, so it is quoted from the dashboard rather than guessed at here. Application logs record token counts and error codes, never image bytes and never the licence key itself.

Sessions

sessions rows carry last_seen_at, ip and user_agent, added in migration 004 so a user can recognise their own sessions. Retained until sign-out or expiry, and expiry is two limits rather than one (lib/auth.ts):

Limit Value
SESSION_DAYS — how long a session may live at all, however busy 30 days
IDLE_DAYS — how long an unused session survives 14 days
VERIFY_HOURS — an email-verification token 48 hours
RESET_HOURS — a password-reset token 2 hours

These are read from the constants, not chosen for this page, so the page cannot drift from the code without the constants moving first.


Who this is

Boetiek House S.L., CIF B75865022, Calle Fernando Fuentes 2, 38300 Santa Cruz de Tenerife, Spain.

Last updated 2026-09-10. Boetiek House S.L., CIF B75865022 — Calle Fernando Fuentes 2, 38300 Santa Cruz de Tenerife, Spain.