---
title: "Record that something was told to an audience"
method: POST
path: "/v2/workspaces/{id}/disclosures"
tags: ["Disclosures"]
---

# Record that something was told to an audience

`POST /v2/workspaces/{id}/disclosures`

## Request

- Base URL: `https://api.infolang.ai`
- URL: `https://api.infolang.ai/v2/workspaces/{id}/disclosures`
- Auth: one of:
  - HTTP bearer
  - HTTP bearer
  - HTTP bearer

The manual counterpart to recall's automatic accounting: a briefing given in a room, a filing mailed, a call made. The response's `disclosure` is the ONLY handle that can later amend, clarify or notice this thread — a client that drops it has recorded a telling it can never annotate.

This ledger records that SPEECH OCCURRED to an audience. It does not record — and nothing in this API implies — that the audience received, read, understood or acted on it. Receipt is unknowable from here; an acknowledgement record is a possible future addition and v1 does not pretend.

Audiences are EXACT: telling `entity:HASC` is not telling `entity:Congress`, and no fold widens one into the other. Membership resolution is an advisory port with no verb yet.

There is no delete and no revoke. The nearest thing is a RETRACTED NOTICE, which coexists with the disclosure it names: telling someone a thing was wrong is more speech, not less.

Requires the `coord:write` scope. Accepts all three lanes: a session JWT (bounded by the caller's role on this workspace) or an `il_*` machine credential whose own scope set, workspace set and validity window cover it — both ceilings apply and neither can raise the other, so a credential carrying `coord:write` is still refused where the role does not permit it.

A credential with no scope record resolves to `LEGACY_DEFAULT`, which does NOT include `coord:write` — mint a key with it explicitly (`POST /v2/workspaces/{id}/keys`).

## Path parameters

- `id` string, required

## Request body

- object
  - `audience` string, required
  - `channel` string, required
  - `disclosure` string, uuid
  - `memory_id` string
  - `content` object
    - `space` 'memory' | 'assertion', required
    - `id` string, required

## Response `201`

The recorded telling

- object
  - `disclosure` string, required
  - `audience` object, required
    - `space` 'entity' | 'partner', required
    - `id` string, required
  - `channel` string, required
  - `content` object, required
    - `space` 'memory' | 'assertion', required
    - `id` string, required
  - `record` string, required
  - `authority` string, required
  - `appended` boolean, required
  - `indexed` boolean, required
  - `index_reason` string

## Other responses

- `401`: Missing/invalid credential, or `credential_expired` — the credential is outside its `[not_before, expires_at)` window and must be replaced
- `403`: `insufficient_scope` — the credential's own scope set, or the caller's role on this workspace, does not cover the scope this route requires (the missing scope is named in the message). Or `forbidden` — the credential is not scoped to this workspace, or holds no grant on it
- `501`: The disclosure verbs are not compiled into this deployment (`kernel-verbs` is off upstream)

---

[API](https://skmtc.dev/infolang/apis/infolang-api.md) · [All operations](https://skmtc.dev/infolang/apis/infolang-api/llms.txt) · [OpenAPI document](https://skmtc.dev/infolang/apis/infolang-api/revisions/d04bf6de72c8?raw)
