Storage and privacy
What Constaia keeps from your documents and for how long, with the none, temporary and persistent modes, keep_results, deletion, encryption and profiles.
By default Constaia does not keep your documents: it processes them and discards them. You can choose, per request or as an account default, how long the file and the results are kept.
Storage modes
Set them with the storage option of POST /v1/analyze (and of batches):
storage | What happens to the file |
|---|---|
none | Synchronous analysis: the file is processed in memory and never written to storage. Async or batch: it is stored encrypted only until the analysis finishes, then deleted. |
temporary | Stored encrypted and deleted automatically after ttl_hours hours (1 to 720; 24 by default). |
persistent | Stored encrypted until you delete it with DELETE /v1/analyses/{id}. |
If you don't send storage, your account default is used, and if you haven't set one, none. Same with
ttl_hours: the account's value or, if none, 24. Defaults are changed in the dashboard
(Account settings).
storage applies to the file. The results (type, verdict, fields) are kept so you can read them with
GET /v1/analyses/{id}, unless you use keep_results: false.
keep_results: false
With keep_results: false the extracted data is not kept either:
- You get the full result once, in the response (or in the webhook if async).
- Afterwards,
GET /v1/analyses/{id}returns404 resource_missingand the analysis does not appear in lists. - Constaia only keeps billing metadata: pages, credits and document type.
{
"file_url": "https://example.com/dni.jpg",
"expect": "es_dni",
"storage": "none",
"keep_results": false
}Hands-on guide: analyse without storing.
The storage object in the response
Every analysis tells you what happened to the file:
"storage": { "mode": "none", "file_deleted_at": "2026-09-29T10:00:02Z", "expires_at": null }"storage": { "mode": "temporary", "file_deleted_at": null, "expires_at": "2026-10-02T10:00:02Z" }| Field | Description |
|---|---|
mode | The mode applied (the one you asked for or the account default). |
file_deleted_at | When the file was deleted, or null if it is still stored. In none mode it matches the end of the analysis. |
expires_at | In temporary mode, when it will be deleted. null otherwise. |
Deleting an analysis
curl -X DELETE https://api.constaia.com/v1/analyses/an_01J9Z8Q3K4M5N6P7Q8R9S0T1V2 \
-H "Authorization: Bearer $CONSTAIA_API_KEY"{ "id": "an_01J9Z8Q3K4M5N6P7Q8R9S0T1V2", "object": "analysis", "deleted": true }It deletes the file, the results and the exports of the analysis. It cannot be undone: afterwards GET returns
404. Use it, for example, when a user exercises their right to erasure.
Exports and downloads
- The
exportsURLs are signed links that expire after 24 hours. After that they return404. See exports. - Every download goes through
https://api.constaia.com/v1/files/…. You never get a direct object storage URL.
Encryption and where data is stored
- Application-level encryption before anything is written: AES-256-GCM with a separate key per account, derived from a master key. The storage provider only sees encrypted data.
- Object storage in the EU: in production, Cloudflare R2 with EU jurisdiction (data is stored in EU data centres), which also encrypts at rest. Only the API server accesses it: none of your or your users' traffic goes to storage URLs; files and exports are always served through the API.
- API keys: stored as a hash (SHA-256) and shown only once when created.
- Webhook secrets: stored encrypted.
- In transit: the whole API is served over HTTPS.
Where documents are processed (regions and AI providers) is covered in data residency.
Processing profiles: sovereign and standard
With the processing option you choose which AI providers may touch a document, per request. If you don't send it,
your account's default profile is used (sovereign when a sovereign provider is available). The account default
cannot be changed from the dashboard yet: send processing on each request or write to
hola@constaia.com.
| Profile | AI providers it may use |
|---|---|
sovereign | Only providers headquartered and operated in the EU: a European model (IONOS, Scaleway, OVHcloud) or a Constaia-hosted one, Mistral OCR (Paris) and the local MRZ and PDF417 readers. |
standard | The above plus Claude on AWS Bedrock (Frankfurt, eu-central-1) or Gemini on Google Vertex AI (EU region). |
About the standard profile
AWS and Google process the data in EU regions, but they are US-headquartered companies and therefore subject to US
law such as the CLOUD Act. If that is a problem for your use case, use sovereign.
If the requested profile is not available, the API answers 422 processing_unavailable. The response includes which
profile was applied and which providers processed the document:
"processing": {
"profile": "sovereign",
"region": "eu",
"mode": "vlm",
"providers": [
{ "name": "tesseract", "region": "local", "role": "local", "model": "mrz" },
{ "name": "openai_compat", "region": "de-fra", "role": "llm", "model": "mistral-small-3.2" }
]
}Each field is described in POST /v1/analyze.
The full list of sub-processors per profile is in the DPA.
Audit log and DPA
- Constaia keeps an audit log of sensitive account actions (who, from which IP and what action).
- The data processing agreement (DPA) is at /en/legal/dpa.
Next steps
Pagination
How to walk Constaia API lists with cursor pagination (limit and starting_after) and filters by status, type and metadata, with code examples.
Data residency & compliance
Where Constaia processes and stores documents, the sovereign and standard processing profiles, the upcoming US region, and how GDPR, CCPA and DPPA apply to your integration.