Building on Subsidia for your clients
A guide for integrators who put Subsidia behind their own software for several client organisations: architecture, one workspace and one key per client, billing, and what to tell a client legal team.
You keep your stack: your models, your retrieval, your automations, your interface. Subsidia adds the layer your clients' legal team asks for, one call at a time: personal data masked before it reaches an external provider, usage metered per client, and a signed proof for what the AI did.
This page is the map. The Partner API is the reference for provisioning and billing; the other pages are linked where they apply.
Four things you can hand to your clients
| Brick | In one sentence | How |
|---|---|---|
| Gateway | Every model call goes through Subsidia and comes back with a signed proof certificate. Without a Subsidia prefix in the model name it is a faithful passthrough. | Change one base URL. Gateway |
| Le Vérificateur | Gives every claim of an answer a verdict against the passages it should rest on (yours or Subsidia's), with zero model calls, and signs the report. | POST /v1/verify. Le Vérificateur |
| Le Registre | The AI Act record of what the AI did for a client, exported as a signed zip its legal team can file. | GET /v1/registre/export. Le Registre |
| Certificate check | Anyone can check a certificate without an account: paste it on the public verification page, or verify it offline with the public key. | GET /v1/gateway/public-key. Proof certificates |
A model call is counted in questions. A Vérificateur check calls no model and is counted as a control, separately. Both appear on each client statement.
Architecture
- Client's users
- Your application
- Client key
- Subsidia (client workspace)
- Model providers
- 1One workspace per client
Create a client workspace for each organisation you serve with
POST /partner/clients. Reads and writes are scoped to the workspace, a dossier can be reserved to named people, and usage, documents, journal and keys never mix between clients. Never run two clients in the same workspace to save a seat: you would lose the statement, the register and the isolation. - 2One restricted key per client application
Mint a key for each client's application with
POST /partner/clients/:id/keys, naming only the capabilities it needs and setting a monthly question ceiling and a rate limit. If a key leaks, you revoke that one key; if the client stops paying, you suspend the workspace without touching the keys. - 3Call Subsidia from your back end with that key
Put the Gateway base URL in your OpenAI or Anthropic client, or call the Cortex and Vérificateur endpoints directly. Keep the partner key out of this path entirely.
- 4Read the statement at month end
GET /partner/clients/:id/statement?month=YYYY-MMgives the client total at your resale terms, the wholesale price and your margin.GET /partner/usage.csvgives one line per client for a spreadsheet.
Keys: scopes, ceilings, read-only
| Scope | Reaches |
|---|---|
engine | /v1/chat/completions, /v1/messages, /v1/models, /v1/ai/*, /v1/proofs, /v1/gateway/* |
knowledge | /v1/knowledge* (sources, query, insights) |
reflex | /engine/*: flows, runs, approvals list |
light | /light/* |
proof | /v1/verify* and /v1/registre* |
webhooks | /v1/webhooks* |
partner | /partner/*. Partner keys only; a client key can never carry it. |
readonly | Not a family: the key can read and ask questions (chat, query, verify), and never change anything. |
A key that names at least one capability is restricted to those routes; anything else answers 403 scope_denied. Keys created before scopes existed keep their full access, which is why a key for a client application must be created through the partner API, which requires a capability.
Two optional ceilings protect you from a runaway integration:
monthlyQuestionLimitrefuses the key with402 API_KEY_BUDGET_EXCEEDEDonce the calendar month's questions are used. It is counted from usage logs, so it can lag a burst by a few seconds: a guard rail, not a meter. Verifier controls do not count.ratePerMinuteanswers429withRetry-After. The counter is shared across server instances.
Change either later with PATCH /developer/api-keys/:id. See Authentication and Rate limits and quotas.
Verify your own RAG answers
If your product already answers from a retrieval pipeline, the fastest win for a regulated client is to check each answer against the passages that retrieval returned, before showing it. You send the answer and the passages; you get a verdict per claim and a signed report, and Cortex is not involved.
curl -X POST https://api.subsidia.protypa.fr/v1/verify \ -H "Authorization: Bearer $CLIENT_KEY" \ -H "Content-Type: application/json" \ -d '{ "text": "Le préavis est de 30 jours.", "passages": [{ "source": "Bail.pdf", "page": 3, "content": "Le préavis est de 90 jours." }] }'The report says coverage.mode: "provided": it attests that this text, against these passages, gave these verdicts. It does not attest that the passages come from your client's documents, because Subsidia did not see those documents. Say so in your own product copy; the report already does. Details in Le Vérificateur.
Automations through the API
A key with the reflex scope can create, edit, run and follow flows. Three things stay with a signed-in person on purpose: deciding an approval, registering notification channels and connections (they hold credentials), and switching on unattended outbound sending. An outbound step (an email, a POST to a service) therefore always waits for a person, unless a person has allowed that flow to run unattended.
To let a flow call a client's software, a person registers the service once in the app (Reflex, Connections) with its base URL and credential headers. The stored values are never shown again and a step can only supply a path, so a flow cannot send the credentials anywhere else. In the cloud, private addresses and redirects are refused.
Read GET /engine/approvals and push approvals to your own notification tooling with the flow.approval.requested webhook. The scheduler itself runs on on-premise installations, not in the cloud.
Webhooks for your own system
Instead of polling, subscribe to source.ingested, source.failed, knowledge.contradiction_detected, knowledge.stale, flow.run.finished and flow.approval.requested. Payloads carry identifiers and status, never document or answer content. A failed delivery is retried three times quickly, then after 5 minutes, 30 minutes, 2 hours and 12 hours. Signature checking, the delivery log and replay are in Webhooks. In the cloud, webhook URLs must be public addresses.
Installs at your clients
For clients who want Subsidia on their own machine, sign the desktop app in with your partner account and pick the client's workspace. The machine is paired and appears in GET /partner/devices. It renews its certificate daily and keeps working offline for the certificate's lifetime; the state reads offline after 3 days without contact and expiring shortly before the offline tolerance ends. A machine whose version is behind the latest release is flagged.
What to tell a client legal team
Who is who. The client is the data controller. You, the integrator, are its processor: you design and operate the application. Protypa, which publishes, hosts and administers Subsidia, is your sub-processor, and the sub-processor relationship is to be covered in the data processing agreement between you and the client.
Where data goes. Documents, conversations, accounts, journals and certificates are stored in France on hosted servers administered by Protypa. On each question, names, emails, phone numbers, addresses and IBANs are replaced by aliases before anything is sent to an external model provider, and the answer is restored in clear for the user. Each client has its own list of authorised model providers; to keep every question inside the European Union, authorise only an EU provider or run a local model on a dedicated machine. A question sent to an authorised provider is processed by that provider after masking.
What Subsidia can prove and control.
- One signed certificate per answer, chained to the previous one, with fingerprints only and no plain content. It can be verified offline without trusting Protypa.
- Isolation per client workspace, and dossiers that can be reserved to named people.
- An access journal: who consulted what, with human reads and AI reads distinguished.
- The AI Act usage register, exportable and signed (Le Registre).
- Access keys per client, with a ceiling, revocable immediately; a client can be suspended and restored.
- No automatic outbound sending (email, message, service call) without a person's approval, enforced by the engine rather than left to the model.
What Subsidia does not claim.
- No certification (ISO 27001, SOC 2, HDS) and no independent penetration test to date.
- Masking greatly reduces the risk of using an external provider; it is not anonymisation in the GDPR sense.
- French hosting covers stored data, not the processing a provider does on a masked question you chose to authorise.
- Subsidia does not sell data, does not train models on clients' data and claims no right over it or over your tools.
Transparency to the client's staff. A client workspace is owned by you. Every member sees a notice that you run it and can reach its documents, its access journal and its keys, and a client administrator can acknowledge that notice. The acknowledgement is visible to you in the client list (managedAckAt in GET /partner/clients). Do not rely on this being invisible: a client team that finds out later will not trust the rest.
Frequently asked
Can I use one workspace and one key for all my clients?
Technically yes, but you would lose per-client statements, per-client registers, per-client ceilings and isolation. One workspace and one key per client is the supported model.
Who is billed for a client workspace?
You. A client workspace is owned by you and its usage counts against your account: one wholesale bill from Protypa to you. You bill your client at your own terms; Subsidia never bills your client. See Partner API.
Can a client use the register without me?
A client administrator who signs in to the workspace sees the register in the app, subject to the plan. Through the API, it is available to any key with the proof scope.
How do I test before provisioning real clients?
Create a client workspace named for testing with a low monthlyQuestionLimit on its key, run your integration against it, and suspend the workspace (PATCH /partner/clients/:id with suspended: true) when you are done.