New York Public Library Whats On The Menu Dataset Structure
Structural layout of the New York Public Library 'What's on the Menu?' open dataset. The dataset is distributed as four related CSV tables (Menu, MenuPage, MenuItem, Dish) packaged in a gzip archive on Amazon S3. This JSON Structure documents the four entity types, their fields, and the foreign-key relationships that join them.
NyplWhatsOnTheMenuDataset is a JSON Structure definition published by New York Public Library What's On The Menu, describing 4 properties. It conforms to the https://json-structure.org/meta/core/v0/# meta-schema.
Properties
Meta-schema: https://json-structure.org/meta/core/v0/#
JSON Structure
{
"$schema": "https://json-structure.org/meta/core/v0/#",
"$id": "https://raw.githubusercontent.com/api-evangelist/new-york-public-library-whats-on-the-menu/refs/heads/main/json-structure/new-york-public-library-whats-on-the-menu-dataset-structure.json",
"name": "NyplWhatsOnTheMenuDataset",
"description": "Structural layout of the New York Public Library 'What's on the Menu?' open dataset. The dataset is distributed as four related CSV tables (Menu, MenuPage, MenuItem, Dish) packaged in a gzip archive on Amazon S3. This JSON Structure documents the four entity types, their fields, and the foreign-key relationships that join them.",
"type": "object",
"properties": {
"menus": {
"type": "array",
"description": "Menu.csv — one row per digitized physical menu object.",
"items": { "type": { "$ref": "#/definitions/Menu" } }
},
"menuPages": {
"type": "array",
"description": "MenuPage.csv — one row per digitized page; child of Menu.",
"items": { "type": { "$ref": "#/definitions/MenuPage" } }
},
"menuItems": {
"type": "array",
"description": "MenuItem.csv — one row per transcribed dish-on-page line item; links MenuPage and Dish.",
"items": { "type": { "$ref": "#/definitions/MenuItem" } }
},
"dishes": {
"type": "array",
"description": "Dish.csv — one row per normalized/deduplicated dish with appearance and price statistics.",
"items": { "type": { "$ref": "#/definitions/Dish" } }
}
},
"definitions": {
"Menu": {
"type": "object",
"description": "A single historical menu. Root of the hierarchy.",
"properties": {
"id": { "type": "uint32", "description": "Primary key." },
"name": { "type": "string" },
"sponsor": { "type": "string" },
"event": { "type": "string" },
"venue": { "type": "string" },
"place": { "type": "string" },
"physical_description": { "type": "string" },
"occasion": { "type": "string" },
"notes": { "type": "string" },
"call_number": { "type": "string", "description": "NYPL catalog call number." },
"keywords": { "type": "string" },
"language": { "type": "string" },
"date": { "type": "string", "description": "Issue/use date; precision varies." },
"location": { "type": "string" },
"location_type": { "type": "string" },
"currency": { "type": "string" },
"currency_symbol": { "type": "string" },
"status": { "type": "string", "description": "Transcription status: complete, under review, to transcribe." },
"page_count": { "type": "uint16" },
"dish_count": { "type": "uint16" }
},
"required": ["id"]
},
"MenuPage": {
"type": "object",
"description": "A digitized page of a Menu.",
"properties": {
"id": { "type": "uint32", "description": "Primary key." },
"menu_id": { "type": "uint32", "description": "Foreign key -> Menu.id." },
"page_number": { "type": "uint16" },
"image_id": { "type": "string", "description": "NYPL Digital Collections image id." },
"full_height": { "type": "uint16" },
"full_width": { "type": "uint16" },
"uuid": { "type": "uuid" }
},
"required": ["id", "menu_id"]
},
"MenuItem": {
"type": "object",
"description": "A transcribed line item positioning a Dish on a MenuPage.",
"properties": {
"id": { "type": "uint32", "description": "Primary key." },
"menu_page_id": { "type": "uint32", "description": "Foreign key -> MenuPage.id." },
"dish_id": { "type": "uint32", "description": "Foreign key -> Dish.id." },
"price": { "type": "decimal", "precision": 12, "scale": 3 },
"high_price": { "type": "decimal", "precision": 12, "scale": 3 },
"xpos": { "type": "double", "description": "Normalized x position (0..1) on the page image." },
"ypos": { "type": "double", "description": "Normalized y position (0..1) on the page image." },
"created_at": { "type": "datetime" },
"updated_at": { "type": "datetime" }
},
"required": ["id", "menu_page_id"]
},
"Dish": {
"type": "object",
"description": "A normalized dish aggregating all MenuItem occurrences of the same name.",
"properties": {
"id": { "type": "uint32", "description": "Primary key." },
"name": { "type": "string" },
"description": { "type": "string" },
"menus_appeared": { "type": "uint32" },
"times_appeared": { "type": "int32" },
"first_appeared": { "type": "uint16", "description": "Earliest appearance year; 0 = unknown." },
"last_appeared": { "type": "uint16", "description": "Latest appearance year; 0 = unknown." },
"lowest_price": { "type": "decimal", "precision": 12, "scale": 3 },
"highest_price": { "type": "decimal", "precision": 12, "scale": 3 }
},
"required": ["id", "name"]
}
},
"x-relationships": [
{ "from": "MenuPage.menu_id", "to": "Menu.id", "cardinality": "many-to-one" },
{ "from": "MenuItem.menu_page_id", "to": "MenuPage.id", "cardinality": "many-to-one" },
{ "from": "MenuItem.dish_id", "to": "Dish.id", "cardinality": "many-to-one" }
]
}
Work with this as data
Every JSON Structure 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 json structure
4 MCP tools reach this
find_json_structuresBrowse and filter every JSON Structure in the catalog.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.
Call it yourself
curl for this page
curl "https://apis.io/api/v1/json-structures/new-york-public-library-whats-on-the-menu-dataset-structure"
curl "https://apis.io/api/v1/json-structures?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.