run402-com · Schema

ProjectEventFeedPage

One page of the cursored events feed — oldest-first by default (catch-up), newest-first with `order=desc` (display). Store `cursor` and pass it as `?cursor=` next time to catch up in one call; a desc page walks older history via `before_cursor` instead. Events become visible within seconds (a short visibility watermark orders concurrent commits, identically in both orders) and are never lost after it.

AIInfrastructureBackendOpen-sourceAgents

Properties

Name Type Description
events array
cursor string High-water mark: the last served event's cursor (present even when `events` is empty — an empty page echoes your own `cursor` unchanged). On `order=desc` pages it is the LIVE high-water mark — the sam
has_more boolean True when more events are immediately available past `cursor` — poll again right away. On `order=desc` pages: true when OLDER rows remain past this page (within any active `source`/`event_type` filter
before_cursor string `order=desc` pages only, and only when older rows remain (`has_more: true`): pass as `?order=desc&before=` for the next OLDER page. Absent on the oldest retained page — its absence IS the end-of-histo
reset boolean True when the supplied position was unusable — an ascending `cursor` that was malformed or older than the retention floor (swept rows can no longer be proven seen), or a malformed desc `before`. The p
earliest_cursor string Present only when `reset` is true: a cursor positioned just before the earliest retained event for this scope.
platform_incidents array Sidecar overlay of GLOBAL (unattributed) platform incidents — open incidents plus incidents resolved after the caller's cursor position. It is a sidecar, NOT interleaved into `events[]`: the numeric c
platform_status string Present and equal to `degraded` only while an open platform incident is global or affects this caller's projects; omitted when clear. A health-assessment rider (same field as on GET /agent/v1/me/statu
View JSON Schema on GitHub

JSON Schema

run402-com-project-event-feed-page-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/run402-com/json-schema/run402-com-project-event-feed-page-schema.json",
  "title": "ProjectEventFeedPage",
  "description": "One page of the cursored events feed — oldest-first by default (catch-up), newest-first with `order=desc` (display). Store `cursor` and pass it as `?cursor=` next time to catch up in one call; a desc page walks older history via `before_cursor` instead. Events become visible within seconds (a short visibility watermark orders concurrent commits, identically in both orders) and are never lost after it.",
  "x-generated": "2026-10-29",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/run402-com-openapi.json#/components/schemas/ProjectEventFeedPage",
  "type": "object",
  "properties": {
    "events": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/ProjectEvent"
      }
    },
    "cursor": {
      "type": "string",
      "description": "High-water mark: the last served event's cursor (present even when `events` is empty — an empty page echoes your own `cursor` unchanged). On `order=desc` pages it is the LIVE high-water mark — the same value a caught-up ascending read with the same filters would return — so a display surface hands off to catch-up polling without a discovery call."
    },
    "has_more": {
      "type": "boolean",
      "description": "True when more events are immediately available past `cursor` — poll again right away. On `order=desc` pages: true when OLDER rows remain past this page (within any active `source`/`event_type` filter) — follow `before_cursor`."
    },
    "before_cursor": {
      "type": "string",
      "description": "`order=desc` pages only, and only when older rows remain (`has_more: true`): pass as `?order=desc&before=` for the next OLDER page. Absent on the oldest retained page — its absence IS the end-of-history signal, so you never fetch a trailing empty page. Same opaque cursor encoding as `cursor`."
    },
    "reset": {
      "type": "boolean",
      "description": "True when the supplied position was unusable — an ascending `cursor` that was malformed or older than the retention floor (swept rows can no longer be proven seen), or a malformed desc `before`. The page restarts (ascending: from the earliest retained event; desc: from the newest page) and `earliest_cursor` is provided — never a bare 4xx, never a silent skip."
    },
    "earliest_cursor": {
      "type": "string",
      "description": "Present only when `reset` is true: a cursor positioned just before the earliest retained event for this scope."
    },
    "platform_incidents": {
      "type": "array",
      "description": "Sidecar overlay of GLOBAL (unattributed) platform incidents — open incidents plus incidents resolved after the caller's cursor position. It is a sidecar, NOT interleaved into `events[]`: the numeric cursor stays monotonic and uncorrupted. Each entry carries a stable `id` so a client dedups across reads. Attributed (per-project) incidents are NOT here — they arrive as `platform_incident` entries inside `events[]`. Present only when at least one such global incident applies; omitted otherwise.",
      "items": {
        "type": "object",
        "required": [
          "id",
          "subsystem",
          "severity",
          "scope",
          "status",
          "started_at"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Stable incident id (`inc_…`) — the dedup key across feed reads."
          },
          "subsystem": {
            "type": "string"
          },
          "severity": {
            "type": "string",
            "enum": [
              "info",
              "minor",
              "major"
            ]
          },
          "scope": {
            "type": "string",
            "enum": [
              "global"
            ],
            "description": "Always `global` in the overlay — attributed incidents ride `events[]`."
          },
          "status": {
            "type": "string",
            "enum": [
              "ongoing",
              "resolved"
            ]
          },
          "summary": {
            "type": "string"
          },
          "started_at": {
            "type": "string",
            "format": "date-time"
          },
          "resolved_at": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Null while the incident is ongoing."
          }
        }
      }
    },
    "platform_status": {
      "type": "string",
      "enum": [
        "degraded"
      ],
      "description": "Present and equal to `degraded` only while an open platform incident is global or affects this caller's projects; omitted when clear. A health-assessment rider (same field as on GET /agent/v1/me/status and GET /tiers/v1/status), never added to unrelated 200s."
    }
  },
  "required": [
    "events",
    "cursor",
    "has_more",
    "reset"
  ],
  "$defs": {
    "ProjectEvent": {
      "type": "object",
      "description": "One immutable fact from the project events feed. `id` doubles as a cursor: pass any event's id (or the page-level `cursor`) as `?cursor=` to resume after it.",
      "properties": {
        "id": {
          "type": "string",
          "description": "Opaque event cursor (`evc_...`). Never parse it; store and echo it as `?cursor=`."
        },
        "event_type": {
          "type": "string",
          "description": "Flat snake_case event name, e.g. `deploy_activated`, `error_fingerprints_observed`, `platform_incident`, `mailbox_suspended`, `project_transfer_initiated`, `organization_past_due`, `verification_failed`, `webhook_disabled` (platform vocabulary) or an app-chosen name such as `signature_completed` (app-events-emit-lane, `source: \"app\"`). The vocabulary is the platform notification event set plus feed-native events plus whatever an app's own deployed code has emitted via `POST /projects/v1/:project_id/events`. `platform_incident` is an ATTRIBUTED platform-fault event: it lands on an affected project's feed when a platform incident resolves, with a compact payload `{ incident_id, subsystem, severity, scope, status, started_at, resolved_at, summary, impact: { count } }` — the real number of that project's invocations the platform, not the app, caused to fail. Global (unattributed) incidents ride the page-level `platform_incidents[]` overlay instead."
        },
        "severity": {
          "type": "string",
          "enum": [
            "info",
            "notice",
            "warn",
            "critical"
          ],
          "description": "event-attention-rules: how significant the event is, stamped at write and never updated. An app event carries what its emitter declared (`info` when it declared nothing); a platform event carries the level registered for its type. States what happened, not how important the class is: `verification_succeeded` is `notice`, `mailbox_suspended` is `warn`."
        },
        "class": {
          "type": "string",
          "description": "Event class stamped at write time: `lifecycle`, `threshold`, `security`, `recovery`, `billing_critical`, `destructive_lifecycle`, `verification`, `platform_incident`, `digest`, or `app` (app-events-emit-lane). Mandatory classes (`security`, `recovery`, `billing_critical`, `destructive_lifecycle`, `verification`, `platform_incident`) are retained 365 days; everything else — including `app`, which is NEVER a mandatory class — 90 days. `platform_incident` is mandatory for the retention floor only — the platform's confession log is not the first thing swept — and is never delivered as a preference-gated notification."
        },
        "source": {
          "type": "string",
          "description": "Producer discriminator. `\"app\"` for a row written by a project's own deployed code via `POST /projects/v1/:project_id/events`; any other value (`gateway`, `apply`, `email-lambda-events`, …) is a platform producer — the internal split among them is an implementation detail. Consumers key on `(source, event_type)` to tell app facts from platform facts; filter with `?source=app` / `?source=platform` on both feed GETs."
        },
        "occurred_at": {
          "type": "string",
          "format": "date-time"
        },
        "payload": {
          "type": "object",
          "description": "Compact fact: resource ids + verdict fields (never bodies or secret material). Oversize payloads carry `payload_truncated: true` + `dropped_keys[]`; the referenced domain resources hold full detail."
        },
        "next_actions": {
          "type": "array",
          "description": "Platform-synthesized drill-downs for this event — the highest-probability next call, identical across HTTP/SDK/CLI/MCP.",
          "items": {
            "type": "object",
            "properties": {
              "type": {
                "type": "string"
              },
              "method": {
                "type": "string"
              },
              "path": {
                "type": "string"
              },
              "command": {
                "type": "string"
              },
              "why": {
                "type": "string"
              }
            }
          }
        }
      }
    }
  }
}

Work with this as data

Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for schemas

4 MCP tools reach this
  • find_json_schemasBrowse and filter every JSON Schema in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/run402-com-project-event-feed-page"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.