# AiCall

object type

One AI provider call YOUR group made, WITH the words (🧾 THE AI LEDGER): the merchant's prompt · the office-composed context · what the model said it understood · the answer · the refs — beside the metering facts the daily rollup already shows. The words live here and in the event lake ONLY; no log line ever carries them.

## Fields

| Field | Type | Notes |
| --- | --- | --- |
| `id` | [ID](/types/#scalars) `ID!` | = the meter event's callId (the provider call's own uuidV7) — the same id the response envelope's extensions.at.ai.calls.id carries. |
| `at` | [String](/types/#scalars) `String!` | No further notes. |
| `requestId` | [ID](/types/#scalars) `ID!` | The wire request's own id (= that response's extensions.at.callId) — every AI call of one press carries it (a planner's route + steps + resolve; a consultation's rounds). |
| `op` | [String](/types/#scalars) `String!` | The wire operation the call served — draftReport · askConsultation · interpretFilter · … |
| `surface` | [String](/types/#scalars) `String!` | The metered surface token (the at.ai.call.v1 roster) — e.g. office.report_draft. |
| `provider` | [String](/types/#scalars) `String!` | No further notes. |
| `model` | [String](/types/#scalars) `String!` | The EXACT model id the provider reported. |
| `effort` | [String](/types/#scalars) `String!` | The reasoning effort the call rode — low \| medium \| high \| xhigh (low everywhere in slice 1). |
| `schemaName` | [String](/types/#scalars) `String!` | No further notes. |
| `status` | [String](/types/#scalars) `String!` | ok \| refused \| error \| timeout. |
| `providerErrorCode` | [String](/types/#scalars) | No further notes. |
| `tokens` | [AiCallTokens](/types/AiCallTokens/) `AiCallTokens!` | No further notes. |
| `costUsd` | [String](/types/#scalars) `String!` | The call's cost — a DECIMAL STRING in USD (nano-dollar exact; the money-string law — never a float). |
| `priceTableVersion` | [String](/types/#scalars) `String!` | No further notes. |
| `latencyMs` | [Int](/types/#scalars) `Int!` | No further notes. |
| `bytesIn` | [Int](/types/#scalars) | No further notes. |
| `bytesOut` | [Int](/types/#scalars) | No further notes. |
| `prompt` | [String](/types/#scalars) | The MERCHANT's words; null where the surface has none (a summary roll, a material extraction, a training draft). |
| `context` | [String](/types/#scalars) | The office-composed context the merchant handed the surface (the page's identity form · the filled fields · the thread); null where none; cut at 8192 with contextTruncated true. |
| `contextTruncated` | [Boolean](/types/#scalars) `Boolean!` | No further notes. |
| `understood` | [String](/types/#scalars) | What the model said it understood the request to be (the echo rule — one sentence, at most 240 characters); null when the call did not answer. |
| `answer` | [String](/types/#scalars) | The surface's answer as it parsed it (the strict JSON text after the echo strip); null when the call did not answer; cut at 16000 with answerTruncated true. |
| `answerTruncated` | [Boolean](/types/#scalars) `Boolean!` | No further notes. |
| `refs` | [AiCallRef](/types/AiCallRef/) `[AiCallRef!]!` | No further notes. |
| `userId` | [ID](/types/#scalars) | No further notes. |
| `sessionId` | [ID](/types/#scalars) | No further notes. |
| `organizationId` | [ID](/types/#scalars) | No further notes. |
