Payload reference
The exact bodies of record.committed, record.failed, and webhook.test, field by field, as the SDK types them.
Every delivery is one JSON object with three fields. event names the event, timestamp is when the event was created, in ISO 8601 UTC (it stays the same on every retry), and data is the event's payload, described below. On the wire the payloads use the route's names, entityId for your record and seq for the entry's position, counted from 0; the pages and the SDKs count the same entry from 1, so seq: 0 is Entry 1 and the SDKs' entry is seq + 1.
The examples follow one evaluation run. The harness writes each action agent-7 takes in run 4417 to the record eval-run-4417, with the idempotency key eval-run-4417:entry-N for Entry N.
record.committed
Entry 3, agent-7 opening a connection outside the test, is committed:
{
"event": "record.committed",
"timestamp": "2026-10-05T14:09:59.204Z",
"data": {
"receiptId": "anc_01jb4r7w2k9x",
"status": "committed",
"verifiedAt": "2026-10-05T14:09:59.204Z",
"verificationId": "0x3f9c...7a12",
"itemCount": 1,
"records": [
{
"itemId": "rit_4kQ9xT2mVb7LpR3s",
"seq": 2,
"kind": "transition",
"applied": true,
"recordType": "machine-action-record",
"entityId": "eval-run-4417",
"referenceId": "eval-run-4417:entry-3"
}
],
"verification": { "verified": true, "latencyMs": 11356, "discrepancies": [] }
}
}| Field | What it is |
|---|---|
receiptId | The id the write's answer returned as receiptId. |
status | committed. |
verifiedAt | When the entry was committed, ISO 8601 UTC. |
verificationId | The reference the entry was committed under, the one the Shared Record shows as "Committed under". Can be null. |
itemCount | How many entries this delivery covers. Entries written close together can commit together, so it can be more than one. |
records[].itemId | The write's intakeId. |
records[].seq | The entry's position on the wire, from 0. seq: 2 is Entry 3 on the pages and entry: 3 in the SDKs. |
records[].kind | transition, or attempt for a write the lifecycle did not allow. |
records[].applied | true when the entry moved the record's state; false for an attempt. |
records[].recordType, records[].entityId | The record: its type and your id for it. |
records[].referenceId | Your idempotency key for the write. |
verification.verified | true. |
verification.latencyMs | How long committing took, in milliseconds, when it was measured. |
verification.discrepancies | Empty for a committed entry. |
The SDK types every field in records[] except kind as one that can be null. TypeScript: RecordCommittedPayload. Python: a dict with the same keys.
record.failed
An incident report's record, incident-0923, was opened with an entry sent as closed. The write was queued, then failed to commit:
{
"event": "record.failed",
"timestamp": "2026-10-05T15:22:41.870Z",
"data": {
"recordType": "machine-action-record",
"entityId": "incident-0923",
"seq": 0,
"code": "RECORD_GENESIS_MISMATCH",
"sentence": "A record opens with recorded; amended and closed come after it."
}
}| Field | What it is |
|---|---|
recordType, entityId | The record. Either can be null when the write never reached the point of naming one. |
seq | The position the write would have taken, counted from 0 like every seq. |
code | The registry's name for the rule that was not met. |
sentence | The rule, in plain words. |
TypeScript: RecordFailedPayload.
webhook.test
{
"event": "webhook.test",
"timestamp": "2026-10-05T13:58:02.115Z",
"data": {
"webhookId": "cmw4m1p7a0003s601d2e9f5tk",
"message": "A test event from PacSpace."
}
}webhookId is the endpoint's id, as the Webhook endpoints routes name it.
Headers on every delivery
| Header | Example |
|---|---|
Content-Type | application/json |
X-Webhook-Event | record.committed |
X-Event-ID | evt_anc_01jb4r7w2k9x. A test event's id starts evt_webhook_test_. |
X-PacSpace-Timestamp | 1791209399204 (Unix time in milliseconds, when this attempt was signed) |
X-PacSpace-Signature | v1=5a2f8c... (two values, comma separated, for 24 hours after a secret rotation with overlap) |