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.
objectThe viewer's repo list changed (new repo created, mirror import finished, etc.). Maps to the sidebar repo query in the SPA.
kindrequiredstring"UserRepoList"
objectThe viewer's org list changed (joined / left an org, org renamed). Maps to the org picker.
kindrequiredstring"UserOrgList"
objectThe unread notification badge count is stale.
kindrequiredstring"NotificationUnread"
objectThe notification inbox feed is stale.
kindrequiredstring"NotificationFeed"
objectA 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.
datarequiredobjectA 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_idrequiredstring
kindrequiredstring"NotificationCreated"
objectTop-level detail metadata for the given repo changed.
datarequiredobjectTop-level detail metadata for the given repo changed.
ownerrequiredstringslugrequiredstring
kindrequiredstring"RepoDetail"
objectBookmarks for the given repo changed.
datarequiredobjectBookmarks for the given repo changed.
ownerrequiredstringslugrequiredstring
kindrequiredstring"RepoBookmarks"
objectOperation log for the given repo advanced.
datarequiredobjectOperation log for the given repo advanced.
ownerrequiredstringslugrequiredstring
kindrequiredstring"RepoOperations"
objectCommit graph / projection for the given repo changed.
datarequiredobjectCommit graph / projection for the given repo changed.
ownerrequiredstringslugrequiredstring
kindrequiredstring"RepoCommits"
objectThe PR list for the given repo changed (open/closed counts, row ordering, a PR was opened/merged/closed).
datarequiredobjectThe PR list for the given repo changed (open/closed counts, row ordering, a PR was opened/merged/closed).
ownerrequiredstringslugrequiredstring
kindrequiredstring"PullRequestList"
objectA specific PR's detail page is stale.
datarequiredobjectA specific PR's detail page is stale.
numberrequiredintegerint64ownerrequiredstringslugrequiredstring
kindrequiredstring"PullRequestDetail"
objectThe 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.
datarequiredobjectThe 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.
ownerrequiredstringslugrequiredstring
kindrequiredstring"IssueList"
objectOne 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.
datarequiredobjectOne 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.
numberrequiredintegerint64ownerrequiredstringslugrequiredstring
kindrequiredstring"IssueDetail"
objectA 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.
datarequiredobjectA 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_idrequiredstring
kindrequiredstring"TeamIssueList"
objectOne 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.
datarequiredobjectOne 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.
numberrequiredintegerint64team_idrequiredstring
kindrequiredstring"TeamIssueDetail"
objectEverything 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.
datarequiredobjectEverything 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_idrequiredstring
kindrequiredstring"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