neosourceDocs
Search docs

Schema-only endpoint for `InvalidationHint`

GET/api/_schema/invalidation_hint

schemaInvalidationHint

Never served. Exists only to force `utoipa` to emit the `InvalidationHint` schema into the generated OpenAPI document so frontend types match the SSE payload.

Authentication is not described for this operation in the spec — that does not mean it is public. Check tokens and scopes.

curl

curl -X GET 'https://neosource.dev/api/_schema/invalidation_hint'

fetch

fetch("https://neosource.dev/api/_schema/invalidation_hint", {
  method: "GET",
});

Responses

200Hint payload shape

application/json

InvalidationHint

One bounded, identifier-only push payload. Serialised as a discriminated JSON object (`{"kind": "...", "data": {...}}`). Variants without identifying data omit `data` entirely.

one of
  • object

    The viewer's repo list changed (new repo created, mirror import finished, etc.). Maps to the sidebar repo query in the SPA.

    kindrequired

    string

    "UserRepoList"

  • object

    The viewer's org list changed (joined / left an org, org renamed). Maps to the org picker.

    kindrequired

    string

    "UserOrgList"

  • object

    The unread notification badge count is stale.

    kindrequired

    string

    "NotificationUnread"

  • object

    The notification inbox feed is stale.

    kindrequired

    string

    "NotificationFeed"

  • object

    A new notification was just written for the viewer. Carries the row id so the SPA can render an optimistic toast without refetching the full inbox; the badge then refetches via `NotificationUnread` which always rides alongside this hint.

    datarequired

    object

    A new notification was just written for the viewer. Carries the row id so the SPA can render an optimistic toast without refetching the full inbox; the badge then refetches via `NotificationUnread` which always rides alongside this hint.

    notification_idrequired

    string

    kindrequired

    string

    "NotificationCreated"

  • object

    Top-level detail metadata for the given repo changed.

    datarequired

    object

    Top-level detail metadata for the given repo changed.

    ownerrequired

    string

    slugrequired

    string

    kindrequired

    string

    "RepoDetail"

  • object

    Bookmarks for the given repo changed.

    datarequired

    object

    Bookmarks for the given repo changed.

    ownerrequired

    string

    slugrequired

    string

    kindrequired

    string

    "RepoBookmarks"

  • object

    Operation log for the given repo advanced.

    datarequired

    object

    Operation log for the given repo advanced.

    ownerrequired

    string

    slugrequired

    string

    kindrequired

    string

    "RepoOperations"

  • object

    Commit graph / projection for the given repo changed.

    datarequired

    object

    Commit graph / projection for the given repo changed.

    ownerrequired

    string

    slugrequired

    string

    kindrequired

    string

    "RepoCommits"

  • object

    The PR list for the given repo changed (open/closed counts, row ordering, a PR was opened/merged/closed).

    datarequired

    object

    The PR list for the given repo changed (open/closed counts, row ordering, a PR was opened/merged/closed).

    ownerrequired

    string

    slugrequired

    string

    kindrequired

    string

    "PullRequestList"

  • object

    A specific PR's detail page is stale.

    datarequired

    object

    A specific PR's detail page is stale.

    numberrequired

    integerint64

    ownerrequired

    string

    slugrequired

    string

    kindrequired

    string

    "PullRequestDetail"

  • object

    The repo's issue list changed — a repo-bound issue was created. Also covers the repo's `open_issue_count`, which the SPA's tab strip reads off the repo-detail payload rather than the list.

    datarequired

    object

    The repo's issue list changed — a repo-bound issue was created. Also covers the repo's `open_issue_count`, which the SPA's tab strip reads off the repo-detail payload rather than the list.

    ownerrequired

    string

    slugrequired

    string

    kindrequired

    string

    "IssueList"

  • object

    One repo-bound issue's detail page is stale (status, priority, assignees, labels, cycle, or the `blocked` flag a link flipped). Reaches `["repos", owner, slug, N]` — `issueKeys.repoDetail` — which no other variant touches: `IssueList` pairs the fuzzy list key with an EXACT repo-detail sweep precisely so a create does not refetch the detail page it just painted, and that pair reaches no detail entry. **Repo-bound issues ONLY** — the counterpart of [`Self::TeamIssueDetail`]'s rule. A team-scoped issue has no `owner`/`slug` to key on at all, and its `number` is team-scoped (`KEY-N`) rather than drawn from the repo's shared PR/issue counter, so the two are not interchangeable in either direction.

    datarequired

    object

    One repo-bound issue's detail page is stale (status, priority, assignees, labels, cycle, or the `blocked` flag a link flipped). Reaches `["repos", owner, slug, N]` — `issueKeys.repoDetail` — which no other variant touches: `IssueList` pairs the fuzzy list key with an EXACT repo-detail sweep precisely so a create does not refetch the detail page it just painted, and that pair reaches no detail entry. **Repo-bound issues ONLY** — the counterpart of [`Self::TeamIssueDetail`]'s rule. A team-scoped issue has no `owner`/`slug` to key on at all, and its `number` is team-scoped (`KEY-N`) rather than drawn from the repo's shared PR/issue counter, so the two are not interchangeable in either direction.

    numberrequired

    integerint64

    ownerrequired

    string

    slugrequired

    string

    kindrequired

    string

    "IssueDetail"

  • object

    A team board's issue list changed — a team-scoped (`KEY-N`) issue was created. Team issues have no `primary_repo_id`, so they are unreachable from any repo-scoped key.

    datarequired

    object

    A team board's issue list changed — a team-scoped (`KEY-N`) issue was created. Team issues have no `primary_repo_id`, so they are unreachable from any repo-scoped key.

    team_idrequired

    string

    kindrequired

    string

    "TeamIssueList"

  • object

    One team-scoped issue's detail page is stale (status, priority, assignees, labels, cycle, or the `blocked` flag a link flipped). **Team-scoped issues ONLY.** `number` is team-scoped (`KEY-N`) here, but a repo-bound issue's `number` comes from the repo's shared PR/issue counter — so emitting this for a repo-bound issue would key on `["teams", team_id, N]` where `N` means something else entirely, invalidating an unrelated board entry and missing the real one. Repo-bound issue detail rides `RepoEvent::IssueUpdated` on the repo-scoped stream instead.

    datarequired

    object

    One team-scoped issue's detail page is stale (status, priority, assignees, labels, cycle, or the `blocked` flag a link flipped). **Team-scoped issues ONLY.** `number` is team-scoped (`KEY-N`) here, but a repo-bound issue's `number` comes from the repo's shared PR/issue counter — so emitting this for a repo-bound issue would key on `["teams", team_id, N]` where `N` means something else entirely, invalidating an unrelated board entry and missing the real one. Repo-bound issue detail rides `RepoEvent::IssueUpdated` on the repo-scoped stream instead.

    numberrequired

    integerint64

    team_idrequired

    string

    kindrequired

    string

    "TeamIssueDetail"

  • object

    Everything keyed on ONE issue's identity is stale — its labels, assignees, issue links and linked PRs. Reaches the `["issues", id, …]` family as a fuzzy prefix (`issueKeys.entity` in the SPA). **Repo-agnostic on purpose**: those keys carry no owner/slug, so this is published for every issue, team-scoped ones included. **One variant, not four per-facet ones.** The publisher (`IssueService::publish_issue_changed`) takes the issue AFTER the write with no diff, so it cannot know which facet moved and would emit all four on every write anyway — four frames, four `keysFor` cases and four ledger entries saying what one prefix says. Naming the issue's IDENTITY rather than a facet is also what a fuzzy prefix means: a fifth `["issues", id, X]` query factory is covered the day it is added, instead of being silently unreachable.

    datarequired

    object

    Everything keyed on ONE issue's identity is stale — its labels, assignees, issue links and linked PRs. Reaches the `["issues", id, …]` family as a fuzzy prefix (`issueKeys.entity` in the SPA). **Repo-agnostic on purpose**: those keys carry no owner/slug, so this is published for every issue, team-scoped ones included. **One variant, not four per-facet ones.** The publisher (`IssueService::publish_issue_changed`) takes the issue AFTER the write with no diff, so it cannot know which facet moved and would emit all four on every write anyway — four frames, four `keysFor` cases and four ledger entries saying what one prefix says. Naming the issue's IDENTITY rather than a facet is also what a fuzzy prefix means: a fifth `["issues", id, X]` query factory is covered the day it is added, instead of being silently unreachable.

    issue_idrequired

    string

    kindrequired

    string

    "IssueEntity"

Standard errors

Bodies documented once for the whole API — see standard errors.

  • 429Rate limited — retry after the `Retry-After` header
  • 500Internal server error
  • 503Service temporarily unavailable / at capacity — retry after the `Retry-After` header
  • 504Gateway timeout — the request exceeded the server's handling budget