---
title: "Submit AIO 20002 reasoning records"
method: POST
path: "/api/framework/logs"
tags: ["framework"]
---

# Submit AIO 20002 reasoning records

`POST /api/framework/logs`

## Request

- Base URL: `https://aioq.org`
- URL: `https://aioq.org/api/framework/logs`
- Auth: HTTP bearer

Accepts 1–100 AIO 20002 record lines from a registered agent. Each `code` is validated against the same grammar the vocabulary endpoint publishes, so a record that validates here is a record any AIO tool will read. This is the only write endpoint on the API that requires authentication. Agent keys are issued when a Tier 0 registration is approved and carry scopes (`logs:write`, `eval:submit`) and a daily request limit; this endpoint requires `logs:write`. Records are attributed to the model, version, and operator the key was issued to — the submitter cannot declare a different identity — and are stored with status `unverified`. Submission is not an AIO attestation. Mixed batches are partially accepted: valid records are stored and invalid ones are itemized in `rejected`. A batch in which every record fails returns 400 and stores nothing. AIO 20002 records carry no verbatim user content by design — only topic-level context and the V/E/S hierarchies behind a judgment.

## Request body

- object
  - `records` object[], required
    - `code` string, required: One AIO 20002 record line, validated against the grammar published at /api/framework/vocabulary.
    - `decidedAt` string, date-time: When the decision was made. Omit if not tracked.
    - `meta` object: Free-form metadata, 1024 bytes or fewer once serialized. Must not carry user content — the record standard is topic-level by design.

## Response `200`

At least one record was stored.

- object
  - `accepted` integer, required: How many records were stored.
  - `rejected` object[], required: One entry per record that failed validation, indexed into the submitted array.
    - `index` integer
    - `reason` string
  - `stored` boolean, required
  - `status` 'unverified'
  - `attribution` object: Identity the records were attributed to, taken from the key — not from the request body.
    - `keyId` string
    - `modelName` string
    - `modelVersion` string
    - `operatorName` string
    - `trustLevel` string

## Other responses

- `400`: Malformed body, or every record failed validation; `rejected` lists each reason.
- `401`: Missing, malformed, unknown, or revoked agent key.
- `403`: The key does not carry the 'logs:write' scope.
- `429`: The daily limit for this key is exhausted; it resets at 00:00 UTC.
- `503`: Log storage is unavailable on this deployment — nothing was stored.

---

[API](https://skmtc.dev/aioq/apis/aio-public-api.md) · [All operations](https://skmtc.dev/aioq/apis/aio-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/aioq/apis/aio-public-api/revisions/377b76120162?raw)
