Skip to content

feat(notification-services-controller): add support for notifications categories - #9984

Draft
zelkibuilds wants to merge 4 commits into
mainfrom
feat/add-category-endpoint-to-nsc
Draft

feat(notification-services-controller): add support for notifications categories#9984
zelkibuilds wants to merge 4 commits into
mainfrom
feat/add-category-endpoint-to-nsc

Conversation

@zelkibuilds

@zelkibuilds zelkibuilds commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Explanation

Current state: The notifications API exposes GET /api/v4/notifications/categories, a server-driven manifest describing the notification-settings taxonomy (category IDs, platform visibility, and AUS preference keys). NotificationServicesController had no way to consume it. The internal makeApiCall helper only supported authenticated POST/DELETE requests with a positional body argument, making unauthenticated GET calls impossible to express without a workaround.

Solution:

  • Reworked makeApiCall from positional args to an options object using a discriminated union: GET/DELETE accept an optional bearerToken and no body; POST requires a body and accepts an optional bearerToken. This makes missing-body/unexpected-body misuse a compile error and enables unauthenticated GET calls. makeApiCall is package-internal (not re-exported from the package index), so this is not a breaking change to consumers.

  • Added getNotificationsCategories() service function that calls the new unauthenticated GET /api/v4/notifications/categories endpoint. Returns [] on HTTP or transport errors.

  • Added two new state fields to NotificationServicesControllerState:

    • metamaskNotificationsCategories: NotificationsCategory[] — persisted, included in state logs/debug snapshots, used in UI.
    • isFetchingMetamaskNotificationsCategories: boolean — UI-only loading flag, not persisted; reset in finally so it cannot get stuck.
  • Added public fetchMetamaskNotificationsCategories() controller method that fetches the categories manifest, stores it in state, and returns it. Exposed through the messenger as NotificationServicesController:fetchMetamaskNotificationsCategories (added to MESSENGER_EXPOSED_METHODS).

  • Updated the notification-api schema types (schema.ts) to include the /api/v4/notifications/categories endpoint, NotificationCategory, and NotificationsCategory schemas. Updated mocks accordingly.

  • Replaced the deprecated ControllerStateChangeEvent import with ControllerStateChangedEvent; the exported type alias NotificationServicesControllerStateChangeEvent is unchanged, so there is no breaking change for consumers.

References

Checklist

  • I've updated the test suite for new or updated code as appropriate
  • I've updated documentation (JSDoc, Markdown, etc.) for new or updated code as appropriate
  • I've communicated my changes to consumers by updating changelogs for packages I've changed
  • I've introduced breaking changes in this PR and have prepared draft pull requests for clients and consumer packages to resolve them

@zelkibuilds zelkibuilds self-assigned this Aug 27, 2026
@zelkibuilds zelkibuilds added the team-notifications Notification Team changes. https://github.com/orgs/MetaMask/teams/notifications label Aug 27, 2026
@zelkibuilds

Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-previews

@github-actions

Copy link
Copy Markdown
Contributor

Preview builds have been published. Learn how to use preview builds in other projects.

Expand for full list of packages and versions.
@metamask-previews/account-tree-controller@8.0.0-preview-36c9af5
@metamask-previews/accounts-controller@39.1.1-preview-36c9af5
@metamask-previews/address-book-controller@7.1.2-preview-36c9af5
@metamask-previews/ai-controllers@0.8.0-preview-36c9af5
@metamask-previews/analytics-controller@2.0.0-preview-36c9af5
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-36c9af5
@metamask-previews/announcement-controller@8.1.0-preview-36c9af5
@metamask-previews/app-metadata-controller@2.0.1-preview-36c9af5
@metamask-previews/approval-controller@9.0.2-preview-36c9af5
@metamask-previews/assets-controller@14.0.2-preview-36c9af5
@metamask-previews/assets-controllers@111.1.3-preview-36c9af5
@metamask-previews/authenticated-user-storage@3.0.2-preview-36c9af5
@metamask-previews/base-controller@9.1.0-preview-36c9af5
@metamask-previews/base-data-service@1.0.0-preview-36c9af5
@metamask-previews/bitcoin-regtest-up@1.0.0-preview-36c9af5
@metamask-previews/bridge-controller@80.0.0-preview-36c9af5
@metamask-previews/bridge-status-controller@75.3.0-preview-36c9af5
@metamask-previews/build-utils@3.0.4-preview-36c9af5
@metamask-previews/chain-agnostic-permission@1.7.0-preview-36c9af5
@metamask-previews/chomp-api-service@4.0.1-preview-36c9af5
@metamask-previews/claims-controller@0.6.1-preview-36c9af5
@metamask-previews/client-controller@1.0.1-preview-36c9af5
@metamask-previews/client-utils@2.1.1-preview-36c9af5
@metamask-previews/compliance-controller@2.1.0-preview-36c9af5
@metamask-previews/composable-controller@12.0.1-preview-36c9af5
@metamask-previews/config-registry-controller@3.1.0-preview-36c9af5
@metamask-previews/connectivity-controller@0.3.0-preview-36c9af5
@metamask-previews/controller-utils@12.3.0-preview-36c9af5
@metamask-previews/core-backend@9.0.0-preview-36c9af5
@metamask-previews/delegation-controller@3.0.2-preview-36c9af5
@metamask-previews/earn-controller@12.2.6-preview-36c9af5
@metamask-previews/eip-5792-middleware@3.0.5-preview-36c9af5
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.1-preview-36c9af5
@metamask-previews/eip1193-permission-middleware@2.0.1-preview-36c9af5
@metamask-previews/eth-block-tracker@15.0.1-preview-36c9af5
@metamask-previews/eth-json-rpc-middleware@24.0.1-preview-36c9af5
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-36c9af5
@metamask-previews/foundryup@1.0.1-preview-36c9af5
@metamask-previews/gas-fee-controller@26.3.2-preview-36c9af5
@metamask-previews/gator-permissions-controller@5.0.2-preview-36c9af5
@metamask-previews/geolocation-controller@1.0.0-preview-36c9af5
@metamask-previews/java-tron-up@1.0.0-preview-36c9af5
@metamask-previews/json-rpc-engine@10.5.0-preview-36c9af5
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-36c9af5
@metamask-previews/keyring-controller@27.1.1-preview-36c9af5
@metamask-previews/kyc-controller@0.0.0-preview-36c9af5
@metamask-previews/local-node-utils@1.0.0-preview-36c9af5
@metamask-previews/logging-controller@9.0.0-preview-36c9af5
@metamask-previews/message-manager@14.1.2-preview-36c9af5
@metamask-previews/messenger@2.0.0-preview-36c9af5
@metamask-previews/messenger-cli@0.2.0-preview-36c9af5
@metamask-previews/money-account-api-data-service@0.4.1-preview-36c9af5
@metamask-previews/money-account-balance-service@2.4.3-preview-36c9af5
@metamask-previews/money-account-controller@1.0.0-preview-36c9af5
@metamask-previews/money-account-upgrade-controller@3.0.2-preview-36c9af5
@metamask-previews/money-account-utils@1.1.0-preview-36c9af5
@metamask-previews/multichain-account-service@13.0.2-preview-36c9af5
@metamask-previews/multichain-api-middleware@4.0.3-preview-36c9af5
@metamask-previews/multichain-network-controller@3.2.4-preview-36c9af5
@metamask-previews/multichain-transactions-controller@7.1.2-preview-36c9af5
@metamask-previews/name-controller@9.1.2-preview-36c9af5
@metamask-previews/network-connection-banner-controller@0.2.1-preview-36c9af5
@metamask-previews/network-controller@36.0.0-preview-36c9af5
@metamask-previews/network-enablement-controller@6.0.5-preview-36c9af5
@metamask-previews/notification-services-controller@26.0.1-preview-36c9af5
@metamask-previews/passkey-controller@3.1.0-preview-36c9af5
@metamask-previews/permission-controller@13.1.1-preview-36c9af5
@metamask-previews/permission-log-controller@5.1.0-preview-36c9af5
@metamask-previews/perps-controller@13.0.0-preview-36c9af5
@metamask-previews/phishing-controller@17.4.0-preview-36c9af5
@metamask-previews/platform-api-docs@0.0.0-preview-36c9af5
@metamask-previews/polling-controller@16.0.9-preview-36c9af5
@metamask-previews/preferences-controller@23.1.0-preview-36c9af5
@metamask-previews/profile-metrics-controller@4.0.3-preview-36c9af5
@metamask-previews/profile-sync-controller@29.0.0-preview-36c9af5
@metamask-previews/ramps-controller@20.0.0-preview-36c9af5
@metamask-previews/rate-limit-controller@7.0.1-preview-36c9af5
@metamask-previews/react-data-query@1.0.0-preview-36c9af5
@metamask-previews/remote-feature-flag-controller@6.0.0-preview-36c9af5
@metamask-previews/sample-controllers@5.0.6-preview-36c9af5
@metamask-previews/seedless-onboarding-controller@10.1.1-preview-36c9af5
@metamask-previews/selected-network-controller@26.1.7-preview-36c9af5
@metamask-previews/sentinel-api-service@1.0.1-preview-36c9af5
@metamask-previews/shield-controller@6.0.1-preview-36c9af5
@metamask-previews/signature-controller@39.2.10-preview-36c9af5
@metamask-previews/smart-transactions-controller@25.1.1-preview-36c9af5
@metamask-previews/snap-account-service@2.1.2-preview-36c9af5
@metamask-previews/social-controllers@2.8.0-preview-36c9af5
@metamask-previews/solana-test-validator-up@1.0.0-preview-36c9af5
@metamask-previews/stellar-quickstart-up@0.0.0-preview-36c9af5
@metamask-previews/storage-service@1.0.2-preview-36c9af5
@metamask-previews/subscription-controller@8.0.1-preview-36c9af5
@metamask-previews/transaction-controller@69.6.1-preview-36c9af5
@metamask-previews/transaction-pay-controller@27.0.0-preview-36c9af5
@metamask-previews/user-operation-controller@41.2.9-preview-36c9af5
@metamask-previews/wallet@12.0.2-preview-36c9af5
@metamask-previews/wallet-cli@0.0.0-preview-36c9af5

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

team-notifications Notification Team changes. https://github.com/orgs/MetaMask/teams/notifications

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant