Everything we store about a call
One row per model call. Thirty-eight columns, listed here in full rather than summarised, because a summary is where the interesting field hides.
| Group | What it is for | Fields |
|---|---|---|
| Your labels | Strings you choose, so the numbers can be grouped the way your org is. | sourceevent_idworkflow_idsession_idprompt_idoperationenvironmentteamtask_keytask_classspan_idparent_span_id |
| Which model ran | Enough to price the call and compare routes. | providermodelbilling_tierinference_geospeedsubstrateharness |
| How much it used | Counts. Never the tokens themselves. | input_tokensoutput_tokenscache_read_tokenscache_creation_tokenscache_creation_1h_tokensreasoning_tokens |
| How it went | Whether the work succeeded, and how the agent was shaped. | statusfinish_reasonoutcome_passedfailing_criteriais_retryis_simulatedorchestration_patternbranch_widthstopping_rule |
| Cost and time | The two numbers the whole product divides by. | idtscost_usdlatency_ms |
The outcome record is shorter: whether it passed, a quality score and how it was graded, an optional link back to your own system, and a value if you supplied one.
What is absent, and why that is structural
No prompt. No completion. No message content. No user identifiers, email addresses or IP addresses. Not because we delete them, because nothing collects them: the SDK builds its payload from the usage block your provider returns, which carries counts rather than text.
This is worth stating plainly since the category norm is the opposite. Tools that grade output quality have to read the output. Margin reads the meter, so the honest description of our access is that we could not show you your own prompts if you asked.
The one exception is a measurement run you start from the console. It clones your repository and runs your own eval harness in a throwaway container on our server, on a model key made for that run alone, capped in dollars and revoked when it ends. While it runs, your evals’ prompts and responses go from our server to OpenRouter. We keep only the run’s cost and outcome records, the same fields the meter records. The checkout is deleted when the run ends, but a daily server backup taken during a run can hold a copy for up to 7 days.
The eleven fields you control
These carry text you write, so they are the one route by which your content could reach us:
source · event_id · workflow_id · session_id · prompt_id · operation · environment · team · task_key · task_class · failing_criteria
They exist to be labels, and short ones work best in the console. Name a workflow invoice-extraction rather than pasting the invoice.
Where it lives
Postgres hosted by Neon in AWS us-east-1, behind an application hosted by Vercel. Encrypted in transit and at rest by both. Those two are our only subprocessors, and the Data Processing Addendum names them, commits to thirty days notice before any change, and gives you the right to object.
A customer who prefers it gets a separate deployment with its own database, so isolation is physical rather than a query filter.
What we will not do
- Train or fine-tune any model on your data.
- Pool your numbers into a benchmark shown to another customer.
- Sell or share your data with anyone outside the subprocessors above.
- Route your model traffic, which is what keeps our advice neutral.
These are commitments in the DPA, not preferences. Deletion is thirty days from a written request, and breach notice is without undue delay and inside seventy-two hours.
Where we are small
No SOC 2 report. We are early enough that buying one would prove a process we have not run for long enough to be worth certifying, and we would rather say that than imply otherwise. What we offer instead is documentation, a filled security questionnaire, and an on-site review on reasonable notice.
If your procurement needs SOC 2 to sign, we are not the right vendor yet. That is a real answer and we would rather give it early.
Questions, or a questionnaire to fill: subh@trymargin.io.