Spaces:
Starting
Starting
| import { NextRequest, NextResponse } from 'next/server'; | |
| import FirecrawlApp from '@mendable/firecrawl-js'; | |
| export async function POST(req: NextRequest) { | |
| try { | |
| const { url } = await req.json(); | |
| if (!url) { | |
| return NextResponse.json({ error: 'URL is required' }, { status: 400 }); | |
| } | |
| // Initialize Firecrawl with API key from environment | |
| const apiKey = process.env.FIRECRAWL_API_KEY; | |
| if (!apiKey) { | |
| console.error("FIRECRAWL_API_KEY not configured"); | |
| return NextResponse.json({ | |
| error: 'Firecrawl API key not configured' | |
| }, { status: 500 }); | |
| } | |
| const app = new FirecrawlApp({ apiKey }); | |
| console.log('[scrape-screenshot] Attempting to capture screenshot for:', url); | |
| console.log('[scrape-screenshot] Using Firecrawl API key:', apiKey ? 'Present' : 'Missing'); | |
| // Use the new v4 scrape method (not scrapeUrl) | |
| const scrapeResult = await app.scrape(url, { | |
| formats: ['screenshot'], // Request screenshot format | |
| waitFor: 3000, // Wait for page to fully load | |
| timeout: 30000, | |
| onlyMainContent: false, // Get full page for screenshot | |
| actions: [ | |
| { | |
| type: 'wait', | |
| milliseconds: 2000 // Additional wait for dynamic content | |
| } | |
| ] | |
| }); | |
| console.log('[scrape-screenshot] Full scrape result:', JSON.stringify(scrapeResult, null, 2)); | |
| console.log('[scrape-screenshot] Scrape result type:', typeof scrapeResult); | |
| console.log('[scrape-screenshot] Scrape result keys:', Object.keys(scrapeResult)); | |
| // The Firecrawl v4 API might return data directly without a success flag | |
| // Check if we have data with screenshot | |
| if (scrapeResult && scrapeResult.screenshot) { | |
| // Direct screenshot response | |
| return NextResponse.json({ | |
| success: true, | |
| screenshot: scrapeResult.screenshot, | |
| metadata: scrapeResult.metadata || {} | |
| }); | |
| } else if ((scrapeResult as any)?.data?.screenshot) { | |
| // Nested data structure | |
| return NextResponse.json({ | |
| success: true, | |
| screenshot: (scrapeResult as any).data.screenshot, | |
| metadata: (scrapeResult as any).data.metadata || {} | |
| }); | |
| } else if ((scrapeResult as any)?.success === false) { | |
| // Explicit failure | |
| console.error('[scrape-screenshot] Firecrawl API error:', (scrapeResult as any).error); | |
| throw new Error((scrapeResult as any).error || 'Failed to capture screenshot'); | |
| } else { | |
| // No screenshot in response | |
| console.error('[scrape-screenshot] No screenshot in response. Full response:', JSON.stringify(scrapeResult, null, 2)); | |
| throw new Error('Screenshot not available in response - check console for full response structure'); | |
| } | |
| } catch (error: any) { | |
| console.error('[scrape-screenshot] Screenshot capture error:', error); | |
| console.error('[scrape-screenshot] Error stack:', error.stack); | |
| // Provide fallback response for development - removed NODE_ENV check as it doesn't work in Next.js production builds | |
| return NextResponse.json({ | |
| error: error.message || 'Failed to capture screenshot' | |
| }, { status: 500 }); | |
| } | |
| } |