Skip to main content
When a guest taps on a menu item, they expect the full picture: complete nutrition facts, allergen warnings with sources, dietary badges, and ingredient breakdowns. The dish query gives you everything you need to build rich product detail pages. Use this query for:
  • Detail pages — Show full nutrition panel and ingredient lists
  • Allergen transparency — Display which specific ingredients contain each allergen
  • Diet verification — Explain why a dish qualifies (or doesn’t) for dietary preferences
  • Order integration — Look up dishes by your POS/ordering system’s ID
Chain and session context come from your headers (X-Session-ID). You don’t need to pass them in the query.

Get Dish Details

query Dish($id: ID!, $partnerRef: Boolean) {
  dish(id: $id, partnerRef: $partnerRef) {
    id
    partnerDishId
    chainId
    name
    description
    category
    imageUrl
    nutrition {
      calories
      fatTotal
      fatSaturated
      fatTrans
      cholesterol
      sodium
      carbohydrates
      dietaryFiber
      sugar
      protein
    }
    allergens {
      type
      displayName
      source
      confidence
    }
    diets {
      type
      displayName
      confidence
    }
    ingredients {
      id
      name
      isKeyIngredient
      allergens
    }
    isCustomizable
    updatedAt
  }
}

Parameters

ParameterTypeRequiredDescription
idIDYesEveryBite dish ID or partner dish ID
partnerRefBooleanNoSet to true if using partner’s dish ID

Response Types

Dish

type Dish {
  id: ID!
  partnerDishId: String!
  chainId: String!
  name: String!
  description: String
  category: String
  imageUrl: String
  nutrition: Nutrition
  allergens: [Allergen!]!
  diets: [Diet!]!
  ingredients: [Ingredient!]
  isCustomizable: Boolean!
  updatedAt: DateTime!
}

Nutrition

type Nutrition {
  calories: Int
  fatTotal: Float
  fatSaturated: Float
  fatTrans: Float
  cholesterol: Float
  sodium: Float
  carbohydrates: Float
  dietaryFiber: Float
  sugar: Float
  protein: Float
}

Allergen

type Allergen {
  type: AllergenType!
  displayName: String!
  source: String           # e.g., "Goat Cheese"
  confidence: Float!       # 0.0 to 1.0
}

enum AllergenType {
  DAIRY
  EGG
  FISH
  SHELLFISH
  TREE_NUT
  PEANUT
  WHEAT
  SOY
  SESAME
}

Diet

type Diet {
  type: DietType!
  displayName: String!
  confidence: Float!
}

Ingredient

type Ingredient {
  id: ID!
  name: String!
  isKeyIngredient: Boolean!
  allergens: [AllergenType!]!
}

Example

query Dish {
  dish(id: "dish_001") {
    id
    name
    description
    category
    nutrition {
      calories
      protein
      carbohydrates
      fatTotal
    }
    allergens {
      type
      displayName
      source
    }
    diets {
      type
      displayName
    }
  }
}

Examples

Get by EveryBite ID

query {
  dish(id: "dish_001") {
    name
    description
    nutrition {
      calories
      protein
      carbohydrates
      fatTotal
    }
    allergens {
      type
      displayName
      source
    }
    diets {
      type
      displayName
    }
  }
}

Get by Partner Dish ID

Use this when you have the Olo/Toast dish ID from your ordering system:
query {
  dish(id: "olo_12345", partnerRef: true) {
    id
    name
    nutrition { calories }
  }
}

Full Nutrition Panel

query FullNutrition {
  dish(id: "dish_001") {
    name
    nutrition {
      calories
      fatTotal
      fatSaturated
      fatTrans
      cholesterol
      sodium
      carbohydrates
      dietaryFiber
      sugar
      protein
    }
  }
}

With Ingredients

query DishWithIngredients {
  dish(id: "dish_001") {
    name
    ingredients {
      id
      name
      isKeyIngredient
      allergens
    }
    isCustomizable
  }
}

Example Response

{
  "data": {
    "dish": {
      "id": "dish_001",
      "partnerDishId": "olo_12345",
      "chainId": "chain-name",
      "name": "Seasonal Harvest Salad",
      "description": "Mixed greens, candied pecans, goat cheese, dried cranberries, citrus vinaigrette",
      "category": "Salads",
      "imageUrl": "https://cdn.urbane.com/dishes/harvest-salad.jpg",
      "nutrition": {
        "calories": 400,
        "fatTotal": 18,
        "fatSaturated": 6,
        "fatTrans": 0,
        "cholesterol": 45,
        "sodium": 520,
        "carbohydrates": 35,
        "dietaryFiber": 8,
        "sugar": 12,
        "protein": 25
      },
      "allergens": [
        {
          "type": "DAIRY",
          "displayName": "Dairy",
          "source": "Goat Cheese",
          "confidence": 1.0
        },
        {
          "type": "TREE_NUT",
          "displayName": "Tree Nut",
          "source": "Candied Pecans",
          "confidence": 1.0
        }
      ],
      "diets": [
        {
          "type": "VEGETARIAN",
          "displayName": "Vegetarian",
          "confidence": 1.0
        },
        {
          "type": "PESCATARIAN",
          "displayName": "Pescatarian",
          "confidence": 1.0
        }
      ],
      "ingredients": [
        {
          "id": "ing_001",
          "name": "Mixed Greens",
          "isKeyIngredient": true,
          "allergens": []
        },
        {
          "id": "ing_002",
          "name": "Candied Pecans",
          "isKeyIngredient": true,
          "allergens": ["TREE_NUT"]
        },
        {
          "id": "ing_003",
          "name": "Goat Cheese",
          "isKeyIngredient": true,
          "allergens": ["DAIRY"]
        },
        {
          "id": "ing_004",
          "name": "Dried Cranberries",
          "isKeyIngredient": false,
          "allergens": []
        },
        {
          "id": "ing_005",
          "name": "Citrus Vinaigrette",
          "isKeyIngredient": false,
          "allergens": []
        }
      ],
      "isCustomizable": false,
      "updatedAt": "2026-01-15T08:30:00.000Z"
    }
  }
}

Handling Missing Data

If nutrition data isn’t available for a dish:
{
  "data": {
    "dish": {
      "id": "dish_999",
      "name": "New Special",
      "nutrition": null,
      "allergens": [],
      "diets": []
    }
  }
}
When nutrition is null, display a message like “Nutrition information not available” rather than showing empty values.

BYO Customization

If isCustomizable is true, the dish supports Build-Your-Own customization. See Customization for details on:
  • Getting customization options
  • Calculating nutrition for selections
  • Choosing between server-side and client-side calculation