Skip to content

The activity log across the person's monorepos (JSON pages, or the person's WebSocket)

The web home's log: what happened in every monorepo the person belongs to, newest first, each line with its monorepo. People, machines and worktrees only: no agent field.

Lines are the activity kinds: push, branch.opened, branch.deleted, merged, review, status (only when a check's state changes), worktree.reported (a new worktree only), worktree.removed, meta.saved (not files a merge brought in). The cache-sync kinds stay on the per-monorepo stream.

Order and cursor: every line has the display key (at, monorepo, seq). next is an opaque cursor, "older than this line"; pass it back as cursor. It is stable while lines arrive: new lines are newer, and a late or repeated delivery never moves a line already paged past.

Where lines come from: each person has a feed (a Durable Object). A monorepo of 100 members or fewer copies its lines into its members' feeds; a larger one is read from its own log on every page. A feed keeps 7 days (at most 1,000,000 lines); older pages, and a monorepo the feed joined with a partial history, are read from the monorepos' own logs, which keep everything. At most 20 logs are read for one page, most recently active first; the rest are named in skipped (narrow with in to read one of them).

With Upgrade: websocket: one socket per person, for every small monorepo. Send {"type": "hello", "since": <landed>} (since optional): the feed replays the lines that landed after it (at most 500, else one resync frame: refetch the first page), then {"type": "caught_up", "landed"}. landed is the feed's own arrival number, not a time: keep the highest seen and send it on reconnect. Live frames:

  • {"type": "event", "landed", "event": FeedEvent}: place it by its display key. The same line can arrive again with a fuller summary (a push's commit count); replace by (monorepo_id, seq).
  • {"type": "summary", "monorepo", "monorepo_id", "summary": FeedSummary}.
  • {"type": "needs", "monorepo", "monorepo_id", "changed": [{repo, branch, state}], "more"}: branches that entered or left "needs you" (state null: left); more: over 50 changed, refetch listNeeds. A large monorepo sends summary and needs only when it crosses 100 members (either way); its line is read again with the list.
  • {"type": "joined", "monorepo", "monorepo_id", "large"}, {"type": "left", "monorepo", "monorepo_id"}: refetch the first page and the list.
  • {"type": "contributed", "monorepo", "monorepo_id", "hour", "kind", "n"}: your own work was counted (kind commit, branch or review; hour the UTC hour, 2026-10-03T17), for work of the last two days; refetch getContributions. Large monorepos send it here too.
  • {"type": "error", "message"}: the frame sent was not understood (anything but hello or the text ping). Nothing changed; the socket stays open. Every frame's monorepo is the owner/name label (as the index last heard it; a rename shows within a minute) and monorepo_id the id. The text ping gets pong. Lines of large monorepos do not come here: open their own event socket with topics=feed (the home opens at most 5; it refreshes the others every 60 s).

Cookie or Bearer. With the cookie, the upgrade must carry Pando's own Origin (403 bad_origin).

GET
https://app.gitpando.com/v1/events

Authorisation

  • credentialoptionalHTTP
  • sessionoptionalAPI key in cookie

Query parameters

  • cursoroptionalstring

    A next from an earlier page.

  • limitoptionalinteger
    maximum: 200, minimum: 1
    Default: 50
  • inoptionalstring

    One monorepo's owner/name (an old name works too). The home narrows by monorepo only.

  • owneroptionalstring

    Only the person's monorepos under this owner (an org's page shows its activity this way). Not with in (400). An owner with none of the person's monorepos gives an empty page.

    pattern: ^[a-z0-9](?:[a-z0-9]|-(?=[a-z0-9])){0,38}$

Returns

101

The person's WebSocket.

200

A page, newest first

JSON
  • eventsarray ofobjectrequired
    11 properties
    • monorepostringrequired

      owner/name, as it is when the line is read.

    • monorepo_idstringrequired

      The monorepo's id. Pages sort by (at, monorepo_id, seq).

    • seqintegerrequired

      The monorepo's event seq. (monorepo_id, seq) is the line's identity.

    • atstringrequired
      format: date-time
    • kindpushorbranch.openedorbranch.deletedormergedorrevieworstatus+7 morerequired
    • repostring | nullrequired

      The repo's name in URLs (meta for the meta layer).

    • repo_pathstring | nullrequired

      projects/web; . for the meta layer and a plain repo.

    • branchstring | nullrequired
    • actorstring | nullrequired

      The person (a login). A meta.saved line from before versions kept the login has the author's name.

    • machinestring | nullrequired

      The credential's name (the machine or sandbox).

    • summaryobject | nullrequired

      Per kind:

      • push, branch.opened: commits (new commits in this push; for a new branch, those not on main), head_title, head, before. commits and head_title arrive a moment after the push (the branch-facts job adds them); null when they could not be read. commits_more: true when a first push of main had more than 250.
      • branch.deleted: before.
      • merged: merge_commit, forced, title (the branch's), head, closes (the issues it closes, as MergeResult has them).
      • review: verdict, comments (a count), head.
      • status: context, state, description, target_url, sha, duration_s (from the run's first pending to this state; null without one), app (the CI service that reported it, null when a member posted it; actor is then that member, else null).
      • worktree.reported, worktree.removed: path, worktree (its id).
      • meta.saved: path, version, deleted.
      • issue.opened, issue.commented, issue.closed (by a person; a merge's close is on its merged line), issue.reopened: number, title, reason (closed: completed or not_planned), excerpt (commented: the first 140 characters). The line's repo is the issue's project.
  • nextstring | nullrequired

    The cursor for the next (older) page; null at the end.

  • from_logsbooleanrequired

    True when the page went past the feed's window and read monorepos' own logs.

  • skippedarray ofstringrequired

    Monorepos (owner/name) not read for this page (over 20 logs); narrow with in to read one.

400

An error

JSON
  • errorobjectrequired
    4 properties
    • codestringrequired
    • messagestringrequired
    • pathsoptionalarray ofstring
    • checksoptionalobject

      GitHub's combined status, plus the required contexts and which are missing.

      6 properties
      • shastring | nullrequired
      • statesuccessorpendingorfailureorerrorormissingorunknownrequired

        success when the merge gate passes; missing when a required context has not reported; unknown while the required checks are (an unforced merge is refused).

      • requiredarray | nullrequired

        Null while unknown.

      • checks_unknownstring | nullrequired

        Why the required checks are unknown, in plain words: "Pando couldn't read this monorepo's required checks; try again", or "pando.toml line 3: expected comma or end of structure; fix it on main, or merge with force". Null otherwise.

      • statusesarray ofobjectrequired

        The latest status per context.

        8 properties
        • shastringrequired
        • contextstringrequired
        • statependingorsuccessorfailureorerrorrequired
        • created_atstringrequired
          format: date-time
        • target_urloptionalstring | null
        • descriptionoptionalstring | null
        • creatoroptionalstring

          The member who posted it (a login); app:<slug> for a status posted with a status token or by a CI integration; hook:<hook id> for a status token from a web hook with no app.

        • appoptionalstring | null

          The CI service that reported it (buildkite, github-actions, ...), stamped by Pando from a status token or a CI integration, never from the body or target_url. Null when a member posted it with their own credential. The web shows the service's mark for a slug it knows.

      • missingoptionalarray ofstring

401

An error

JSON
  • errorobjectrequired
    4 properties
    • codestringrequired
    • messagestringrequired
    • pathsoptionalarray ofstring
    • checksoptionalobject

      GitHub's combined status, plus the required contexts and which are missing.

      6 properties
      • shastring | nullrequired
      • statesuccessorpendingorfailureorerrorormissingorunknownrequired

        success when the merge gate passes; missing when a required context has not reported; unknown while the required checks are (an unforced merge is refused).

      • requiredarray | nullrequired

        Null while unknown.

      • checks_unknownstring | nullrequired

        Why the required checks are unknown, in plain words: "Pando couldn't read this monorepo's required checks; try again", or "pando.toml line 3: expected comma or end of structure; fix it on main, or merge with force". Null otherwise.

      • statusesarray ofobjectrequired

        The latest status per context.

        8 properties
        • shastringrequired
        • contextstringrequired
        • statependingorsuccessorfailureorerrorrequired
        • created_atstringrequired
          format: date-time
        • target_urloptionalstring | null
        • descriptionoptionalstring | null
        • creatoroptionalstring

          The member who posted it (a login); app:<slug> for a status posted with a status token or by a CI integration; hook:<hook id> for a status token from a web hook with no app.

        • appoptionalstring | null

          The CI service that reported it (buildkite, github-actions, ...), stamped by Pando from a status token or a CI integration, never from the body or target_url. Null when a member posted it with their own credential. The web shows the service's mark for a slug it knows.

      • missingoptionalarray ofstring

403

An error

JSON
  • errorobjectrequired
    4 properties
    • codestringrequired
    • messagestringrequired
    • pathsoptionalarray ofstring
    • checksoptionalobject

      GitHub's combined status, plus the required contexts and which are missing.

      6 properties
      • shastring | nullrequired
      • statesuccessorpendingorfailureorerrorormissingorunknownrequired

        success when the merge gate passes; missing when a required context has not reported; unknown while the required checks are (an unforced merge is refused).

      • requiredarray | nullrequired

        Null while unknown.

      • checks_unknownstring | nullrequired

        Why the required checks are unknown, in plain words: "Pando couldn't read this monorepo's required checks; try again", or "pando.toml line 3: expected comma or end of structure; fix it on main, or merge with force". Null otherwise.

      • statusesarray ofobjectrequired

        The latest status per context.

        8 properties
        • shastringrequired
        • contextstringrequired
        • statependingorsuccessorfailureorerrorrequired
        • created_atstringrequired
          format: date-time
        • target_urloptionalstring | null
        • descriptionoptionalstring | null
        • creatoroptionalstring

          The member who posted it (a login); app:<slug> for a status posted with a status token or by a CI integration; hook:<hook id> for a status token from a web hook with no app.

        • appoptionalstring | null

          The CI service that reported it (buildkite, github-actions, ...), stamped by Pando from a status token or a CI integration, never from the body or target_url. Null when a member posted it with their own credential. The web shows the service's mark for a slug it knows.

      • missingoptionalarray ofstring

404

An error

JSON
  • errorobjectrequired
    4 properties
    • codestringrequired
    • messagestringrequired
    • pathsoptionalarray ofstring
    • checksoptionalobject

      GitHub's combined status, plus the required contexts and which are missing.

      6 properties
      • shastring | nullrequired
      • statesuccessorpendingorfailureorerrorormissingorunknownrequired

        success when the merge gate passes; missing when a required context has not reported; unknown while the required checks are (an unforced merge is refused).

      • requiredarray | nullrequired

        Null while unknown.

      • checks_unknownstring | nullrequired

        Why the required checks are unknown, in plain words: "Pando couldn't read this monorepo's required checks; try again", or "pando.toml line 3: expected comma or end of structure; fix it on main, or merge with force". Null otherwise.

      • statusesarray ofobjectrequired

        The latest status per context.

        8 properties
        • shastringrequired
        • contextstringrequired
        • statependingorsuccessorfailureorerrorrequired
        • created_atstringrequired
          format: date-time
        • target_urloptionalstring | null
        • descriptionoptionalstring | null
        • creatoroptionalstring

          The member who posted it (a login); app:<slug> for a status posted with a status token or by a CI integration; hook:<hook id> for a status token from a web hook with no app.

        • appoptionalstring | null

          The CI service that reported it (buildkite, github-actions, ...), stamped by Pando from a status token or a CI integration, never from the body or target_url. Null when a member posted it with their own credential. The web shows the service's mark for a slug it knows.

      • missingoptionalarray ofstring
Navigation

Type to search…

↑↓ navigate↵ selectEsc close