Menu Items & Favorites — Integration Guide

Last Updated: 2026-09-03  |  Route Prefix: /api/mobilecontent/

These are legacy APIs that serve existing mobile app features — app navigation (MenuItems) and user-saved bookmarks (Favorites). They use the Mobile-prefixed database tables (MobileMenuItems, MobileFavorites, MobileItemTypes). Mobile developers integrate via the MobileMenu.ApiClient NuGet package.

Menu Items

Returns the full navigation tree for the authenticated user, filtered by the user's profile attributes (airline, role, etc.). Items are normalized into a hierarchical structure client-side from a flat list.

GET  /api/mobilecontent/menuitems/getallforuser   → IEnumerable<MenuItem>
Auth: Endpoint is [AllowAnonymous]. When no authenticated user is present, a default empty UserPrivileges profile is used and only publicly visible items are returned.

MenuItem response fields

FieldTypeDescription
idintDatabase ID.
parentIdint?Parent menu item ID for building the tree.
sortOrderintDisplay order within the parent.
titlestringDisplay label. May be a template — see Title templates.
descriptionstring?Subtitle or short description.
pathstring?Deep-link path or route.
imageSourcestring?Icon or image asset reference.
glyphstring?Icon glyph identifier.
glyphFontFamilystring?Font family for the glyph.
enabledboolWhether the item is tappable.
visibleboolWhether the item is shown in the list.
specialCodestring?Reserved for special handling logic in the app.
showOnHomeScreenboolWhether to surface this item on the home screen.
showToAdminboolWhether to show only to admin users.
showOnTabBarboolWhether to include in the bottom tab bar.
showOnTabBarSortintSort order within the tab bar.

Title templates

A title rendered by the Blazor nav chromes (bottom tab bar, drawer row, drawer hero card) may carry {token} placeholders that the app fills from the signed-in member's profile at render time, so one record labels itself per member. Resolution is client-side (ITemplateResolver, AB#2661); the vocabulary is the public properties of the app's AppProperties bag, walked by reflection:

TokenValue
{Member.MEC}The member's MEC code, canonical case (e.g. DAL). Any public profile property is reachable the same way: {Member.LEC}, {Member.BaseAirport}, {Member.FirstName}. Member and UserInfo are two properties on the bag pointing at the same profile, so {UserInfo.MEC} is the same value.
{mec}Alias for the member's MEC — the spelling the dynamic-feed containerTitle/title templates already use.

Example: "title": "{Member.MEC} MEC" renders DAL MEC for a Delta member and UAL MEC for a United member. Tokens match case-insensitively ({Member.mec} works). A title with no braces is plain text and passes through unchanged.

Fallbacks when no member is known (signed out, profile not yet loaded, blank field): the MEC slot record (path /mec) renders My MEC; any other record renders its literal text with the tokens removed ("{UserInfo.LEC} Council"Council). A raw token is never shown.

Rollout note: while the MEC slot record ships the plain title MEC (Id 230, as served 2026-09-03), the app applies the default template {mec} MEC to that one record. Once the record carries a template of its own, the record's template wins and the client default is not consulted. Templated titles are consumed by the Blazor chromes only; a surface that renders title verbatim would show the braces, so keep templates on Blazor-hybrid records.


Favorites

Favorites are user-specific bookmarks. Each favorite references an item by itemTypeId (category) and itemId (string identifier within that category). The Favorites API requires authentication — all endpoints except /itemtypes return 401 when no valid user is present.

Auth: [Authorize] required for all Favorites endpoints except GET /itemtypes.

Endpoints

GET     /api/mobilecontent/favorites                          → IEnumerable<Favorite>   (authenticated user's favorites)
GET     /api/mobilecontent/favorites/itemtypes                → IEnumerable<ItemType>   (anonymous)
POST    /api/mobilecontent/favorites                          → Favorite  (201 Created, or 200 if already exists)
DELETE  /api/mobilecontent/favorites/{itemTypeId}/{itemId}    → 204 No Content

GET /favorites — Get user's favorites

Returns all favorites for the authenticated user. Sorted by SortOrder. Empty list if the user has no favorites.

GET /favorites/itemtypes — Get item type catalog

Returns the lookup table of item type categories (e.g., "Flight", "News", "Event"). Use these IDs in add/remove operations. This endpoint does not require authentication.

ItemType response fields

FieldTypeDescription
idintID used in add/remove requests.
descriptionstringHuman-readable category name.

POST /favorites — Add a favorite

Adds a new favorite for the authenticated user. If the same itemTypeId + itemId combination already exists for this user, the existing record is returned with 200 OK (idempotent — no duplicate is created).

FavoriteRequest (POST body)

FieldTypeRequiredNotes
itemTypeIdintYesMust be a valid ID from GET /itemtypes.
itemIdstringYesIdentifier of the item within the type (e.g., flight number, article ID).
sortOrderintNoDisplay order hint. Default 0.
titlestring?NoDisplay label for the favorite (e.g., "UAL 123 ORD→SFO").

Favorite response fields

FieldTypeDescription
idintDatabase ID.
userIdstringThe authenticated user's ID.
itemTypeIdint
itemTypeNamestringDescription from the ItemTypes lookup.
itemIdstring
sortOrderint
titlestring?

DELETE /favorites/{itemTypeId}/{itemId} — Remove a favorite

Permanently removes the specified favorite for the authenticated user. Returns 404 if the favorite does not exist for this user.


Complete Endpoint Reference

GET     /api/mobilecontent/menuitems/getallforuser
GET     /api/mobilecontent/favorites
GET     /api/mobilecontent/favorites/itemtypes
POST    /api/mobilecontent/favorites
DELETE  /api/mobilecontent/favorites/{itemTypeId}/{itemId}