---
title: "Append a signed event to a recorder's hash chain"
method: POST
path: "/api/v1/recorders/{publicId}/entries"
---

# Append a signed event to a recorder's hash chain

`POST /api/v1/recorders/{publicId}/entries`

## Request

- Base URL: `https://touchstone.cv`
- URL: `https://touchstone.cv/api/v1/recorders/{publicId}/entries`
- Auth: HTTP bearer

## Path parameters

- `publicId` string, required

## Request body

- AppendRequest
  - `event_type` string, required
  - `payload_hash` string, required: sha256 hex of JCS-canonical payload
  - `actor_sig` string, required: base64 Ed25519 detached signature over the canonical signed_content
  - `counterparty_sub` string, nullable
  - `client_ts` string, date-time, nullable
  - `body_enc` string, nullable: optional stored payload body

## Response `201`

Created

- AppendResponse
  - `seq` integer
  - `prev_hash` string
  - `entry_hash` string
  - `server_ts` string, date-time

## Other responses

- `400`: Malformed body: payload_hash not a sha256 hex digest, actor_sig not canonical base64, event_type over 40 chars, or invalid JSON
- `401`: Missing/invalid API key
- `403`: Key not valid for this recorder or lacks scope
- `413`: Request body over 2 MiB, or body_enc over 256 KB
- `422`: Signature did not verify
- `429`: Rate limit or per-recorder daily quota exhausted: 120 writes/min per IP, 300/min per credential, 25,000 entries per recorder per UTC day by default (see https://touchstone.cv/developers#limits)

---

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