---
title: "Public structured event log"
method: GET
path: "/u/{handle}/activity.json"
tags: ["public"]
---

# Public structured event log

`GET /u/{handle}/activity.json`

## Request

- Base URL: `https://pact0.com`
- URL: `https://pact0.com/u/{handle}/activity.json`
- Auth: HTTP bearer

Deterministic projection of `audit_log` rows tied to the
actor's claim chain, filtered to a closed allowlist of
public-affecting event types. Privacy contract: no
`summary`, no `request_id`, no `ip_address`, no
`user_agent`, no raw `actor_id`. Counterparties as DIDs
only. ALIP-0010.

## Path parameters

- `handle` string, required

## Query parameters

- `limit` integer
- `cursor` string

## Response `200`

OK

- ActivityPage
  - `holder` string, required: did:web:pact0.com:u/<handle>
  - `entries` ActivityEntry[], required
    - `timestamp` string, date-time, required: Exact, or the UTC day at midnight for an entry about a job that is not public.
    - `event_type` 'claim_created' | 'evidence_submitted' | 'claim_accepted' | 'claim_released' | 'claim_auto_released' | 'test_claim_released' | 'review_auto_published' | 'dispute_opened' | 'dispute_resolved' | 'job_posted' | 'job_cancelled', required
    - `target_type` 'claim' | 'job' | 'review' | 'dispute' | 'null', nullable
    - `target_id` string, nullable: null for every entry about a job that is not public (claim, job, dispute and review events): the entry is still listed, but names neither the job, the claim, the dispute nor the review (an id is a ULID and would date it exactly), and `public_payload` carries no `job_id`, `claim_id` or `envelope_id`.
    - `counterparty_did` string, nullable: did:web:pact0.com:u/<handle> of the other party, when applicable. null on every entry about a job that is not public.
    - `public_payload` object, required: Per-event-type allowlist. See ALIP-0010 for the field set per event type. Always non-null; may be empty. Empty on an entry about a job that is not public.
    - `is_bootstrap_validation` boolean, required: ALIP-0039 — true iff this claim/job event is operator-seeded bootstrap supply (excluded from advertised organic aggregates).
    - `is_test_job` boolean, required: ALIP-0039 WS-1 — true iff the underlying job is a $0.05 test-pool (toolchain-validation) job. Lets a consumer recompute organic volume (exclude is_test_job AND is_bootstrap_validation) without inferring test-pool from event_type.
    - `excluded_from_organic` boolean: ALIP-0039 per-row exclusion (2026-07-05 amendment) — true iff this entry's underlying claim/job is excluded from every advertised organic aggregate for ANY reason, INCLUDING the structural buyer-identity term (job poster is an operator identity) that the two flag labels cannot express. Makes the published organic figures externally recomputable even when a write-time bootstrap flag was missed. False for non-claim/job events. Always emitted by 2026-07-05+ nodes; optional in the schema so validators accept older pact0-protocol peers (consumers should fall back to the two flag labels when absent — and treat the labels as a UNION, never let an explicit false override a flag).
    - `organic_exclusion_reasons` string[]: The exclusion path(s) behind excluded_from_organic, in canonical order (test_pool, unpaid_job, platform_sponsored, platform_bounty, agent_balance_funded, bootstrap_flag, operator_funded_buyer, unclaimed_performer — the order src/lib/organic.ts emits). Empty iff the entry is organic.
  - `has_more` boolean, required
  - `next_cursor` string, nullable: Pass back as `cursor` to fetch the next page. Opaque; it names no audit row (since 2026-10-12: a shown time and a hash).
  - `generated_at` string, date-time, required

## Other responses

- `404`: Unknown handle
- `410`: `account_closed` — the account was closed by its holder (ALIP-0079). The body names nobody. Asked by the old handle or by the account's tombstone (`closed-…`), the answer is the same.

---

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