Purdue HFS Dining Menus API

A public, keyless HTTP API operated by Purdue University Housing and Food Services at api.hfs.purdue.edu, serving dining-court locations, published daily menus by location and date, and per-item nutrition and allergen data. The host is Purdue's own web infrastructure (CNAME wpvwebasp03-01.www.purdue.edu, 128.210.7.106) and the service identifies itself as Purdue.Hfs.Menus.Domain in its own error stack traces, so this is Purdue software on Purdue servers rather than a vendor platform behind a Purdue hostname. HFS publishes no documentation, no OpenAPI, no terms of use and no rate limit; the contract in this repository was written from live probes and is marked generated accordingly.

Operations 4

GET /locations List dining locations #
GET /locations/{location}/{date} Get one location's published menu for one date #
GET /items/{itemId} Get nutrition and allergen detail for one menu item #
GET /file/{fileId} Fetch a location logo or photo #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/purdue-hfs-dining-menus-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no email required.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

purdue-hfs-dining-menus-api-openapi.yml Raw ↑
openapi: 3.1.0
x-method: generated
x-source-url: https://api.hfs.purdue.edu/menus/v2/locations
x-provenance:
  generated: '2026-08-30'
  method: generated
  source: >-
    Hand-written by API Evangelist from live, keyless HTTP probes of
    https://api.hfs.purdue.edu/menus/v2/ on 2026-08-30. Purdue University Housing and Food
    Services publishes no OpenAPI of its own; every path, parameter, status code and field name
    below was observed in an actual response. Nothing here is inferred from documentation.
  x-operator: institution
info:
  title: Purdue Housing and Food Services Dining Menus API
  summary: Keyless read API for Purdue dining court locations, daily menus and item nutrition.
  description: >-
    A public, keyless HTTP API operated by Purdue University Housing and Food Services (HFS) at
    api.hfs.purdue.edu, serving the dining-court locations, published daily menus and per-item
    nutrition and allergen data used by Purdue's own dining apps and by student-built campus apps.
    The host is a Purdue-operated web server (CNAME wpvwebasp03-01.www.purdue.edu, 128.210.7.106);
    the service identifies itself in error stack traces as Purdue.Hfs.Menus.Domain, so this is
    Purdue's own software running on Purdue's own infrastructure - not a vendor platform under a
    Purdue hostname. No API key, quota or terms-of-use page was found; treat the service as
    undocumented-but-public and harvest politely.
  version: 'v2'
  contact:
    name: Purdue University Housing and Food Services
    url: https://www.housing.purdue.edu/
  x-unofficial-description: true
servers:
  - url: https://api.hfs.purdue.edu/menus/v2
    description: Production - observed live, keyless, 2026-08-30
tags:
  - name: Locations
    description: Dining courts, quick-bite and on-the-go retail locations.
  - name: Menus
    description: Published daily menus by location and date.
  - name: Items
    description: Nutrition and allergen detail for a single menu item.
  - name: Media
    description: Location logo and photo binaries.
paths:
  /locations:
    get:
      tags: [Locations]
      operationId: listLocations
      summary: List dining locations
      description: >-
        Returns every dining location HFS publishes, with address, coordinates, phone, image
        references and the location types in use. Observed 200 with a 35,766-byte JSON body.
      responses:
        '200':
          description: A locations document.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LocationsResponse'
  /locations/{location}/{date}:
    get:
      tags: [Menus]
      operationId: getLocationMenu
      summary: Get one location's published menu for one date
      description: >-
        Returns the meals, stations and items published for a location on a calendar date.
        `location` is the location Name (for example `Earhart`), not the LocationId. A location
        name that does not exist returns 500 with an ASP.NET exception body, not 404 - see the
        errors artifact.
      parameters:
        - name: location
          in: path
          required: true
          description: Location Name as returned by /locations, for example `Earhart`.
          schema:
            type: string
          example: Earhart
        - name: date
          in: path
          required: true
          description: Calendar date in YYYY-MM-DD form.
          schema:
            type: string
            format: date
          example: '2026-08-30'
      responses:
        '200':
          description: The published menu for that location and date.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LocationMenu'
        '404':
          description: Observed when the date segment is omitted entirely.
        '500':
          description: >-
            Observed for an unknown location name - an unhandled
            System.InvalidOperationException is returned rather than a 404.
  /items/{itemId}:
    get:
      tags: [Items]
      operationId: getMenuItem
      summary: Get nutrition and allergen detail for one menu item
      description: >-
        Returns the nutrition panel for a menu item ID taken from a menu response. The collection
        form `/items` responds 405, which is how the path was confirmed to exist.
      parameters:
        - name: itemId
          in: path
          required: true
          schema:
            type: string
            format: uuid
          example: 9f2ef8e3-0d9c-4fc3-aa1d-949b3af47633
      responses:
        '200':
          description: Nutrition detail for the item.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MenuItemDetail'
        '405':
          description: Returned for the collection form `/items` with no ID.
  /file/{fileId}:
    get:
      tags: [Media]
      operationId: getFile
      summary: Fetch a location logo or photo
      parameters:
        - name: fileId
          in: path
          required: true
          schema:
            type: string
            format: uuid
          example: b6c2089d-7737-4953-b1d9-0ad8e7c3cc40
      responses:
        '200':
          description: Image binary.
          content:
            image/*:
              schema:
                type: string
                format: binary
components:
  schemas:
    LocationsResponse:
      type: object
      description: Observed shape of GET /locations.
      properties:
        Types:
          type: array
          items:
            type: string
          examples:
            - ['Dining Courts', 'Quick Bites', 'On-the-GO!']
        Location:
          type: array
          items:
            $ref: '#/components/schemas/Location'
    Location:
      type: object
      properties:
        LocationId:
          type: string
        Name:
          type: string
        FormalName:
          type: string
        Address:
          $ref: '#/components/schemas/Address'
        PhoneNumber:
          type: string
        Latitude:
          type: number
        Longitude:
          type: number
        Images:
          type: array
          items:
            type: string
            format: uuid
        ImageUrls:
          type: array
          items:
            type: string
            format: uri
        LogoUrl:
          type: string
          format: uri
        DarkModeLogoUrl:
          type: string
          format: uri
    Address:
      type: object
      properties:
        Street:
          type: string
        City:
          type: string
        State:
          type: string
        ZipCode:
          type: string
        Country:
          type: string
        CountryCode:
          type: string
    LocationMenu:
      type: object
      properties:
        Location:
          type: string
        Date:
          type: string
          description: Observed as US M/D/YYYY in the response body, though the request takes YYYY-MM-DD.
        IsPublished:
          type: boolean
        Notes:
          type: [string, 'null']
        Meals:
          type: array
          items:
            $ref: '#/components/schemas/Meal'
    Meal:
      type: object
      properties:
        ID:
          type: string
          format: uuid
        Name:
          type: string
        Order:
          type: integer
        Status:
          type: string
          description: Observed values include Open and Closed.
        Type:
          type: string
        Hours:
          type: [object, 'null']
          properties:
            StartTime:
              type: string
            EndTime:
              type: string
        Notes:
          type: [string, 'null']
        Stations:
          type: array
          items:
            $ref: '#/components/schemas/Station'
    Station:
      type: object
      properties:
        Name:
          type: string
        Items:
          type: array
          items:
            $ref: '#/components/schemas/MenuItem'
    MenuItem:
      type: object
      properties:
        ID:
          type: string
          format: uuid
        Name:
          type: string
        IsVegetarian:
          type: boolean
        NutritionReady:
          type: boolean
        Allergens:
          type: array
          items:
            $ref: '#/components/schemas/Allergen'
    Allergen:
      type: object
      properties:
        Name:
          type: string
        Value:
          type: boolean
    MenuItemDetail:
      type: object
      properties:
        Nutrition:
          type: array
          items:
            type: object
            properties:
              Name:
                type: string
              Value:
                type: [number, 'null']
              LabelValue:
                type: [string, 'null']
              DailyValue:
                type: [number, 'null']
              Ordinal:
                type: integer