A Node.js Express backend server that provides a clean API interface to the Metropolitan Museum of Art's public collection API. Features built-in caching, rate limiting, and comprehensive artwork search capabilities.
- Node.js (version 20 or higher)
- npm or yarn package manager
- Clone the repository:
git clone git@github.com:kawanofer/met-museum-backend.git
cd met-museum-backend- Install dependencies:
npm install- Create a
.envfile in the root directory:
MET_API_BASE_URL=https://collectionapi.metmuseum.org
PORT=3001- Start the server:
npm startThe server will start running on http://localhost:3001
- 🎨 Artwork Search: Search for artworks with images, by artist, or by department
- 🏛️ Department Listings: Get all available museum departments
- 📦 Smart Caching: 1-hour TTL cache to reduce API calls and improve performance
- 🚦 Rate Limiting: Built-in queue system to respect Met Museum API limits (70 req/sec, 5 concurrent)
- 🌐 CORS Enabled: Ready for frontend integration
- 🛡️ Error Handling: Comprehensive error handling with meaningful responses
GET /api/artworks/search/images?q=painting
Returns an array of object IDs for artworks that have images.
Query Parameters:
q(optional): Search query (default: "painting")
GET /api/artworks/:objectID
Returns detailed information about a specific artwork.
Parameters:
objectID(required): The Met Museum object ID
GET /api/artworks/search/artist?q=van gogh
Returns detailed artwork information for works by a specific artist or culture.
Query Parameters:
q(required): Artist name or culture
GET /api/departments
Returns all available museum departments.
GET /api/artworks/search/department?departmentId=11&q=portrait
Returns detailed artwork information from a specific department.
Query Parameters:
departmentId(required): Department IDq(required): Search query
- Uses
node-cachewith a 1-hour TTL (Time To Live) - Reduces API calls to the Met Museum API
- Improves response times for repeated requests
- Implements
p-queuefor request management - Limits to 70 requests per second (below Met Museum's ~80 req/sec limit)
- Maximum 5 concurrent requests to prevent API overload
- Graceful handling of Met Museum API errors
- Rate limit detection (403 errors)
- Detailed error logging for debugging
- Consistent error response format
- express: Web framework for Node.js
- axios: HTTP client for API requests
- cors: Cross-Origin Resource Sharing middleware
- dotenv: Environment variable management
- node-cache: In-memory caching solution
- p-queue: Promise queue with rate limiting
MET_API_BASE_URL: Base URL for Met Museum API (default: https://collectionapi.metmuseum.org)PORT: Server port (default: 3001)
- Metropolitan Museum of Art for providing the public API