An API request goes through Moon AI, where Moon Blur masks the personal data it detects in the text, then to the model provider, which receives the rest. Moon AI keeps only metadata: the cost, the tokens, and the state of a video job.
What Moon AI keepsLink to the What Moon AI keeps section
Moon AI does not keep the content of your API requests.
- Prompts and responses are neither stored nor written to logs.
- An API call does not create a conversation.
- Every response carries the
X-Moon-Prompt-Storage:header.none
Moon AI keeps billing data, not content: the model, the number of tokens, the cost in credits, the latency (total and to the first token), the request ID and its date. This data is tied to your workspace for billing and abuse prevention.
- Every day, these rows are added up per workspace, per model and per day.
- Per-request rows can be deleted after 90 days, never before 31 days (the 30-day spend cap reads them). Only the daily totals remain after that.
- Financial records (top-ups, invoices, adjustments) are never deleted: they are kept according to accounting rules.
- The originating IP address is not stored.
The “Request log” in the portal’s “Usage” tab shows the model, the tokens, the cost and the time, never the content.
MediaLink to the Media section
| Endpoint | What is kept |
|---|---|
| Images | Nothing: images come back in the response, in base64. |
| Videos | The job’s state (status, duration, resolution, aspect ratio, cost), not your description or the video. The video is read from the provider at download time: download it within the hour. |
| Speech, transcription | Nothing: audio and text are processed in memory, never written. |
| Embeddings | Nothing: vectors come back in the response. |
OCR (moon-ocr-1) | Nothing: the document is read on our servers in France and never leaves them. |
Moon BlurLink to the Moon Blur section
Moon Blur replaces the personal data it detects (email addresses, phone numbers, bank details, ID numbers…) with placeholders, such as [MB_EMAIL_1], before the request goes to the model. The real values are put back in the response before it reaches you.
What is maskedLink to the What is masked section
For chat (/):
- the text of the messages;
- tool calls, whether their arguments are a JSON string or an object;
- the reasoning you send back to the model.
An end-user identifier (user, safety_identifier, prompt_cache_key) or a message name that contains personal data becomes a pseudonym (user- followed by 32 characters). This pseudonym stays the same from one request to the next within your workspace, and is different in any other workspace.
For embeddings, the texts you send are masked the same way (see Embeddings).
What is not maskedLink to the What is not masked section
- Files, images and audio are sent as is: Moon Blur reads only text.
- The image, video, speech and transcription endpoints do not use Moon Blur (
X-Moon-Blur:): your description, the text to read and the audio go to the model provider as is.not_applied - OCR does not need it: the document never leaves our servers (
X-Moon-Blur:).not_needed - The “Your data to mask” list in the chat settings does not apply to the API.
What Moon Blur does not guaranteeLink to the What Moon Blur does not guarantee section
Detection relies on patterns: it does not catch everything. A name on its own, for example, is not recognized.
The response with real values restoredLink to the The response with real values restored section
Masked values are put back before the response reaches you: in the text, in the reasoning and in the tool call arguments, which remain valid JSON. This also works when a placeholder is split across two chunks of a stream.
RefusalsLink to the Refusals section
When Moon Blur cannot apply, the request is never sent unmasked:
| HTTP | code | Case |
|---|---|---|
| 503 | moon_blur_unavailable | Moon Blur failed: the request is not sent to the model and nothing is charged. Retry after Retry-After (5 seconds). |
| 413 | moon_blur_payload_too_large | A text exceeds 500,000 characters, too long to be scanned in full: the request is refused and nothing is charged. Split the text, or turn off Moon Blur on the key. |
HeadersLink to the Headers section
| Header | Value |
|---|---|
X-Moon-Blur | on (Moon Blur applied), off (Moon Blur turned off), not_applied (endpoint without Moon Blur), not_needed (OCR). |
X-Moon-Blur-Redactions | Number of values replaced, when there are any. |
Turn off Moon Blur on a keyLink to the Turn off Moon Blur on a key section
Moon Blur is on by default for every key. The workspace owner or an admin can turn it off for a key in the portal’s “API keys” tab (see Authentication). The change is recorded in the workspace audit log. A key without Moon Blur sends its requests as is.
What model providers seeLink to the What model providers see section
Moon AI routes the request to the provider of the chosen model, which receives whatever Moon Blur leaves visible and processes it under its own terms.
For chat, the provider object can restrict providers to those that state they do not reuse data (data_collection: ) or retain nothing (zdr: true). These are commitments made by the providers, which Moon AI does not verify (see Provider preferences).
So the API is neither “zero data retention” nor “processed entirely in France”. Only the moon-ocr-1 OCR runs entirely on our servers in France (hosting: in /v1/models).
API responses and errors carry neither the provider’s name nor its internal IDs: id is the request ID at Moon AI, and model is the model you called (or the exact version served).
See alsoLink to the See also section
- Moon AI’s privacy policy.
- Moon Blur in the chat: the Moon Blur section and the Moon Blur overview.