Applies to: Catalog API
Learn how to manage menus with the Catalog API and catalog categories.
This guide walks you through syncing menus using the Square Catalog API, for example, to display a seller's offerings in your kiosk, mobile application, or online ordering site. You'll also learn how to create root menu categories and organize menus for different services, such as breakfast and lunch.
When a seller creates a menu through the Square Dashboard, the system automatically creates catalog categories with a CategoryType of MENU_CATEGORY. These categories are used to organize items in the seller's menu and are distinct from regular catalog categories.
Key points about menu categories:
- Automatically created when sellers build menus in the Square Dashboard.
- Have a
category_typeofMENU_CATEGORY. - Used specifically for menu organization.
- Like regular categories, can have parent-child relationships.
- Can be used across different sales channels.
Note
When working with catalog categories, your application needs to handle two distinct types: REGULAR_CATEGORY and MENU_CATEGORY. If your application already has logic that processes REGULAR_CATEGORY objects, maintain this logic separately from any new code that handles MENU_CATEGORY objects.
REGULAR_CATEGORY objects continue to be essential for critical business operations, including:
- Generating sales reports for menu items.
- Routing orders to kitchen printers.
Even if you implement support for MENU_CATEGORY, don't remove or modify your existing REGULAR_CATEGORY handling. Both category types serve different purposes and should coexist in your application.
- A Square account with Square Free, Plus, and Premium subscribers with advanced restaurant capabilities added.
- A Square account with full service, quick service, or bar mode enabled in the Square Point of Sale application.
- Your Square application credentials.
- Authorization to use the Square Catalog API.
When integrating with your application or other external systems, you need an efficient way to sync menu data. This section covers both the initial sync and incremental updates.
CatalogCategory objects handle location visibility differently than other Catalog objects. Instead of direct location assignment, they use channels as an abstraction layer:
- Channel objects act as the bridge between menu categories and locations.
- Each Location has a corresponding channel (identified by
reference.type = "LOCATION"). - Menu categories declare visibility by listing channel IDs in their
channelsarray.
To synchronize menus for a specific location:
- Get the channel ID for your target location.
- Filter menu categories to include only those referencing that channel.
- Sync only these filtered categories to ensure location-specific accuracy.
for more information about mapping channels to locations, see Channels API - Menu visibility.
In the following examples, a restaurant creates a breakfast menu and lunch menu. Each menu has a root category and child categories. The breakfast beverages menu has a submenu for coffee drinks.
To perform a complete menu sync with an external service (such as a delivery platform), you need three specific API calls to get all menu-related catalog objects in the correct hierarchy.
First, use SearchCatalogObjects to get all top-level menu categories for the channel you want to sync. The query uses three filters:
exact_queryis set to the category type of menu.set_queryis set to the channels you want to return.range_querylimits the returned menu to root menus.
Search catalog objects
This returns CatalogCategory objects that are both top-level categories and menu categories. These objects form your root menu structure.
Note
The present_at_all_locations property might be set to true or false but because menu visibility is controlled by the channels property, this property has no effect.
Get all of the descendants of the root categories.
Next, use SearchCatalogObjects to get all child categories under these root categories:
Search catalog objects
This returns all categories that are both menu categories (category_type = "MENU_CATEGORY") and have their root_category_id set to one of the IDs from the first call.
When working with menu categories, it's important to understand the distinction between parent_category_id and root_category_id:
Direct parent vs. root category
parent_category_idindicates the immediate parent of a category.root_category_idindicates the top-level ancestor of a category.
These IDs are different if a category is nested multiple levels deep.
When you make this API call, it shows all categories under a main menu item. For example, in a coffee shop menu:
- Root category: "Breakfast Menu" (ID:
3H3ADZMYJU6U27JYO2PZFANQ)- Parent category: "Beverages" (ID:
H5P6BRQKWKL6BDZKIS4FGPSM)- Category: "Coffee-drinks" (ID:
ZTVXYFS633S6GSLMHVP5O5IG)
- Category: "Coffee-drinks" (ID:
- Parent category: "Beverages" (ID:
{ "object": { "type": "CATEGORY", "id": "ZTVXYFS633S6GSLMHVP5O5IG", "updated_at": "2025-06-02T22:04:56.684Z", "created_at": "2025-06-02T22:04:56.898Z", "version": 1748901896684, "is_deleted": false, "present_at_all_locations": true, "category_data": { "name": "Coffee-drinks", "image_ids": [ "BAXRGSINXCHS7RW4ZMQSHGGL" ], "category_type": "MENU_CATEGORY", "parent_category": { "id": "H5P6BRQKWKL6BDZKIS4FGPSM", "ordinal": -2251731094208512 }, "is_top_level": false, "channels": [ "CH_IT55vdjtd81xkZvF68NXQqPO54qnOXkyQRkiBQlQuYC", "CH_leic5ZC8kuuyAVAIQUlxuEG72EYFNBoxFCz5574e9945o" ], "online_visibility": false, "root_category": "3H3ADZMYJU6U27JYO2PZFANQ" } } }
To properly reconstruct the menu hierarchy, always check the parent_category_id to determine where each category belongs in the structure.
To complete the menu, your application needs to get the items, variations, any modifier lists, images, and other resources related to the items shown on the menus. You can get all this information with a single API call. Note that you need to include the "include_related_objects": true query parameter.
Finally, use SearchCatalogObjects to get all items in the categories returned by the previous API call.
Search catalog objects
When processing these results, follow this specific order:
-
Root categories (from the first call):
- Store the root category IDs.
- Note which are top-level menu categories.
- These form the base of your menu structure.
-
Child categories (from the second call):
- Link each child category to its parent and root categories.
- Maintain the
MENU_CATEGORYhierarchy. - Store these category IDs for the next step.
-
Items and variations (from the third call):
- Link items to their appropriate categories.
- Process all variations for each item.
- Include any related objects (such as modifiers and images).
To keep your application's menu data current with the seller's Square catalog, implement a periodic sync strategy to capture various types of menu changes.
- Item modifications (price, description, or images)
- Menu structure changes (new categories or item reorganization)
- Item availability updates
- New item additions or removals
To learn about tracking availability updates, see Monitor Sold-out Item Variations or Modifiers.
You can efficiently track these changes using the updated_at timestamp in the SearchCatalogObjects endpoint:
This example returns all menu categories modified after June 11, 2025, at 7:00 AM:
Search catalog objects
After retrieving any changes to the menu structure, you want to get any changes to menu items and related types.
This example retrieves items, variations, images, taxes, discounts, modifiers, and modifier lists. These types are usually defined for menu items and might change frequently. The list of types that you sync might be different.
This example asks for all changes (including deletions) in these types made after June 10, 2025, at 7:00 PM:
Search catalog objects
Note
If you include related objects, your result set might include other related objects even if they haven't changed.
-
Initial load
- Perform the initial sync during off-peak hours.
- Process objects in the correct order (categories → items → modifiers).
- Validate relationships as you build the menu structure.
-
Incremental updates
- Store the last sync timestamp.
- Include related objects in update queries.
- Handle deleted objects appropriately.
-
Error handling
- Implement retry logic for failed requests.
- Log sync errors for troubleshooting.
- Maintain a sync status dashboard.
-
Data validation
- Verify category relationships.
- Validate price points.
- Check for required attributes.
When working with the Catalog API, it's important to understand the distinction between menu categories and regular categories:
-
Menu categories
- Created through the Square Dashboard's menu builder.
- Have
category_type = "MENU_CATEGORY". - Used specifically for menu organization.
- Like regular categories, support parent-child relationships.
- Can be synchronized across channels.
-
Regular categories
- Created through the Catalog API.
- Have
category_type = "REGULAR_CATEGORY". - Used for general item organization.
- Might appear as duplicates of menu categories.
Important
When retrieving categories through the Catalog API, you might see what appears to be duplicate categories. This happens because the menu builder creates separate menu categories (MENU_CATEGORY) from regular categories (REGULAR_CATEGORY). To work specifically with menu structures, always filter for categories where category_type = "2" (MENU_CATEGORY`).
For Food & Beverage operations, Square supports separate kitchen display names to streamline back-of-house operations. These properties allow restaurants to use different names for kitchen staff versus customer-facing displays, improving order accuracy and kitchen efficiency.
Available properties:
- CatalogItem.kitchen_name - A kitchen-friendly name for the menu item.
- CatalogItem.buyer_facing_name - The customer-facing name displayed to buyers.
- CatalogItemVariation.kitchen_name - Kitchen name for specific item variations (sizes and options).
- CatalogModifier.kitchen_name - Kitchen name for modifiers (such as add-ons and customizations).
Benefits for restaurant operations:
These properties help restaurants:
- Use abbreviated or coded names on kitchen display systems (KDSs).
- Maintain appetizing, descriptive names for customer receipts and online ordering.
- Reduce confusion during food preparation with standardized kitchen terminology.
- Speed up order fulfillment by using familiar kitchen shorthand.
- Support multi-language operations (kitchen names in one language, buyer names in another).
Example: Creating items with kitchen names
curl https://connect.squareupsandbox.com/v2/catalog/object \ -X POST \ -H 'Square-Version: 2026-08-19' \ -H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \ -H 'Content-Type: application/json' \ -d '{ "idempotency_key": "unique-key-789", "object": { "type": "ITEM", "id": "#grilled_chicken_salad", "item_data": { "name": "Grilled Chicken Caesar Salad", "kitchen_name": "GRL CKN CAESAR", "buyer_facing_name": "Caesar Salad with Grilled Chicken", "description": "Fresh romaine lettuce with grilled chicken breast", "category_id": "SALADS_CATEGORY_ID", "variations": [ { "type": "ITEM_VARIATION", "id": "#salad_regular", "item_variation_data": { "item_id": "#grilled_chicken_salad", "name": "Regular", "kitchen_name": "REG", "pricing_type": "FIXED_PRICING", "price_money": { "amount": 1295, "currency": "USD" } } }, { "type": "ITEM_VARIATION", "id": "#salad_large", "item_variation_data": { "item_id": "#grilled_chicken_salad", "name": "Large", "kitchen_name": "LG", "pricing_type": "FIXED_PRICING", "price_money": { "amount": 1595, "currency": "USD" } } } ], "modifier_list_info": [ { "modifier_list_id": "DRESSING_MODIFIER_LIST_ID" } ] } } }'
Example: Adding kitchen names to modifiers
curl https://connect.squareupsandbox.com/v2/catalog/object \ -X POST \ -H 'Square-Version: 2026-08-19' \ -H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \ -H 'Content-Type: application/json' \ -d '{ "idempotency_key": "unique-key-456", "object": { "type": "MODIFIER_LIST", "id": "#dressing_options", "modifier_list_data": { "name": "Dressing Options", "modifiers": [ { "type": "MODIFIER", "id": "#ranch_dressing", "modifier_data": { "name": "Ranch Dressing", "kitchen_name": "RANCH", "modifier_list_id": "#dressing_options" } }, { "type": "MODIFIER", "id": "#caesar_dressing", "modifier_data": { "name": "Caesar Dressing", "kitchen_name": "CAESAR", "modifier_list_id": "#dressing_options" } }, { "type": "MODIFIER", "id": "#no_dressing", "modifier_data": { "name": "No Dressing", "kitchen_name": "NO DRESS", "modifier_list_id": "#dressing_options" } } ] } } }'
Best practices for kitchen names:
- Keep it concise - Kitchen names should be short and easy to read on kitchen display screens.
- Use standard abbreviations - Develop consistent abbreviations your kitchen staff understands.
- Consider screen space - Kitchen display systems often have limited character width.
- Test with staff - Ensure kitchen names are clear and unambiguous to your team.
- Update consistently - When adding new items, maintain your naming conventions.
Common kitchen name patterns:
| Customer Name | Kitchen Name | Purpose |
|---|---|---|
| Grilled Chicken Caesar Salad | GRL CKN CAESAR | Abbreviated ingredients |
| Mediterranean Veggie Wrap | MED VEG WRAP | Shortened descriptors |
| Extra Virgin Olive Oil | EVOO | Industry standard abbreviations |
| Add Avocado (+$2.00) | +AVO | Modifier shorthand |
| No Onions | NO ONION / -ONION | Exclusion indicators |
| Gluten-Free Bun | GF BUN | Dietary abbreviations |
Use the Catalog API to retrieve existing menu categories.
Search catalog objects
When creating categories for different locations, ensure that you:
- Set the correct
category_type. - Establish proper parent-child relationships.
- Use consistent naming across locations.
The following shows an example for a delivery service menu category:
Upsert catalog object
Note
Menu objects are automatically enabled across all locations by default. When creating or updating menu objects using the API:
- Set
present_at_all_locationstotrueor omit it entirely. - Don't set
present_at_location_idsorabsent_at_location_ids(leave these fields empty).
Location-specific menu configuration can only be managed through the Square Dashboard. This includes:
- Enabling or disabling menus for specific locations.
- Setting location-specific menu availability.
- Managing location-based menu variations.
When creating subcategories, always reference the parent menu category.
Upsert catalog object
When working with menu categories, it's important to understand that the structure you see in the Square Dashboard is represented by MENU_CATEGORY types in the Catalog API. The following example shows how different menu structures might look:
Restaurant Menu (MENU_CATEGORY) ├── Beverages │ ├── Non-Alcoholic │ │ ├── Iced Tea (Small/Large) │ │ ├── Soft Drinks (Regular/Large) │ │ └── Coffee (Small/Large) │ ├── Beer │ │ ├── Draft (Domestic/Craft) │ │ └── Bottled (Domestic/Imported) │ └── Wine │ ├── Red (Glass/Bottle) │ └── White (Glass/Bottle) ├── Appetizers │ ├── Mozzarella Sticks │ ├── Wings (6pc/12pc) │ └── Nachos └── Entrees ├── Sandwiches │ ├── Club │ └── BLT └── Salads ├── Caesar └── Garden
Delivery Menu (MENU_CATEGORY) ├── Beverages │ ├── Iced Tea (Small/Large) │ ├── Soft Drinks (Regular/Large) │ └── Coffee (Small/Large) ├── Appetizers │ ├── Mozzarella Sticks │ ├── Wings (6pc/12pc) │ └── Nachos └── Entrees ├── Sandwiches │ ├── Club │ └── BLT └── Salads ├── Caesar └── Garden
- Cause: Items appearing in both menu and regular categories.
- Solution: Filter specifically for
MENU_CATEGORYtypes. - Prevention: Use proper category type filtering in API calls.
- Cause: Looking at the wrong category type.
- Solution: Check both menu and regular category associations.
- Prevention: Implement proper category type checking.
- Cause: Mixing menu and regular categories.
- Solution: Maintain proper parent-child relationships.
- Prevention: Validate category types and relationships.
-
Category filtering
Search catalog objects
-
Relationship maintenance
- Track both menu and regular category IDs.
- Update all relevant category associations.
- Maintain a proper hierarchy.
-
Data validation
- Verify category types before updates.
- Check parent-child relationships.
- Validate item associations.
-
Verify data
- Compare item counts.
- Validate category structures.
- Check modifier associations.
-
Monitor performance
- Track sync times.
- Monitor API usage.
- Optimize query patterns.
-
Setup alerts
- Configure sync failure notifications.
- Monitor for pricing discrepancies.
- Alert when structure changes occur.