| # Crossword Puzzle API Specification | |
| ## Base URL | |
| - Development: `http://localhost:3000/api` | |
| - Production: `https://your-backend-domain.com/api` | |
| ## Authentication | |
| No authentication required for this MVP version. | |
| ## Endpoints | |
| ### GET /topics | |
| Retrieve all available topics for crossword generation. | |
| **Response:** | |
| ```json | |
| { | |
| "topics": [ | |
| { | |
| "id": 1, | |
| "name": "Animals", | |
| "description": "Creatures from the animal kingdom" | |
| }, | |
| { | |
| "id": 2, | |
| "name": "Science", | |
| "description": "Scientific terms and concepts" | |
| } | |
| ] | |
| } | |
| ``` | |
| **Status Codes:** | |
| - `200 OK` - Success | |
| - `500 Internal Server Error` - Database error | |
| --- | |
| ### POST /generate | |
| Generate a new crossword puzzle based on selected topics and difficulty. | |
| **Request Body:** | |
| ```json | |
| { | |
| "topics": ["Animals", "Science"], | |
| "difficulty": "medium", | |
| "gridSize": 15 | |
| } | |
| ``` | |
| **Parameters:** | |
| - `topics` (string[]): Array of topic names to include | |
| - `difficulty` (string): "easy" | "medium" | "hard" | |
| - `gridSize` (number, optional): Grid size (default: 15) | |
| **Response:** | |
| ```json | |
| { | |
| "puzzle": { | |
| "id": "puzzle_123", | |
| "grid": [ | |
| [ | |
| { "letter": "D", "number": 1, "isBlocked": false }, | |
| { "letter": "", "number": null, "isBlocked": true } | |
| ] | |
| ], | |
| "clues": { | |
| "across": [ | |
| { | |
| "number": 1, | |
| "clue": "Man's best friend", | |
| "answer": "DOG", | |
| "startRow": 0, | |
| "startCol": 0, | |
| "length": 3 | |
| } | |
| ], | |
| "down": [ | |
| { | |
| "number": 2, | |
| "clue": "Feline pet", | |
| "answer": "CAT", | |
| "startRow": 0, | |
| "startCol": 2, | |
| "length": 3 | |
| } | |
| ] | |
| }, | |
| "metadata": { | |
| "difficulty": "medium", | |
| "topics": ["Animals"], | |
| "wordCount": 8, | |
| "generatedAt": "2024-01-15T10:30:00Z" | |
| } | |
| } | |
| } | |
| ``` | |
| **Status Codes:** | |
| - `200 OK` - Puzzle generated successfully | |
| - `400 Bad Request` - Invalid request parameters | |
| - `422 Unprocessable Entity` - Unable to generate puzzle with given constraints | |
| - `500 Internal Server Error` - Generation failed | |
| --- | |
| ### POST /validate | |
| Validate user answers against the puzzle solution. | |
| **Request Body:** | |
| ```json | |
| { | |
| "puzzleId": "puzzle_123", | |
| "answers": { | |
| "1_across": "DOG", | |
| "2_down": "CAT" | |
| } | |
| } | |
| ``` | |
| **Response:** | |
| ```json | |
| { | |
| "validation": { | |
| "isComplete": false, | |
| "correctCount": 1, | |
| "totalCount": 2, | |
| "results": { | |
| "1_across": { | |
| "correct": true, | |
| "expected": "DOG", | |
| "provided": "DOG" | |
| }, | |
| "2_down": { | |
| "correct": false, | |
| "expected": "CAT", | |
| "provided": "CAR" | |
| } | |
| } | |
| } | |
| } | |
| ``` | |
| **Status Codes:** | |
| - `200 OK` - Validation completed | |
| - `400 Bad Request` - Invalid puzzle ID or answers format | |
| - `404 Not Found` - Puzzle not found | |
| - `500 Internal Server Error` - Validation failed | |
| --- | |
| ### GET /words/:topic (Admin/Development) | |
| Retrieve all words for a specific topic. Useful for development and debugging. | |
| **Parameters:** | |
| - `topic` (string): Topic name | |
| **Response:** | |
| ```json | |
| { | |
| "topic": "Animals", | |
| "words": [ | |
| { | |
| "id": 1, | |
| "word": "DOG", | |
| "length": 3, | |
| "difficulty": 1, | |
| "clues": [ | |
| { | |
| "id": 1, | |
| "text": "Man's best friend", | |
| "difficulty": 1 | |
| } | |
| ] | |
| } | |
| ] | |
| } | |
| ``` | |
| **Status Codes:** | |
| - `200 OK` - Words retrieved | |
| - `404 Not Found` - Topic not found | |
| - `500 Internal Server Error` - Database error | |
| ## Error Response Format | |
| All error responses follow this format: | |
| ```json | |
| { | |
| "error": { | |
| "code": "VALIDATION_ERROR", | |
| "message": "Invalid difficulty level", | |
| "details": { | |
| "field": "difficulty", | |
| "allowedValues": ["easy", "medium", "hard"] | |
| } | |
| } | |
| } | |
| ``` | |
| ## Rate Limiting | |
| - Generate endpoint: 10 requests per minute per IP | |
| - Other endpoints: 100 requests per minute per IP | |
| ## CORS Configuration | |
| - Allowed origins: Frontend domain(s) | |
| - Allowed methods: GET, POST, OPTIONS | |
| - Allowed headers: Content-Type, Authorization | |
| ## Data Types | |
| ### Grid Cell | |
| ```typescript | |
| interface GridCell { | |
| letter: string; // Empty string for user input cells | |
| number: number | null; // Clue number if cell starts a word | |
| isBlocked: boolean; // True for black squares | |
| } | |
| ``` | |
| ### Clue | |
| ```typescript | |
| interface Clue { | |
| number: number; // Clue number | |
| clue: string; // Clue text | |
| answer: string; // Expected answer | |
| startRow: number; // Starting row in grid | |
| startCol: number; // Starting column in grid | |
| length: number; // Word length | |
| } | |
| ``` | |
| ### Puzzle Metadata | |
| ```typescript | |
| interface PuzzleMetadata { | |
| difficulty: 'easy' | 'medium' | 'hard'; | |
| topics: string[]; | |
| wordCount: number; | |
| generatedAt: string; // ISO timestamp | |
| } | |
| ``` |