firecrawl-security-basics
Security guidelines for handling Firecrawl API keys and verifying webhook signatures securely.
Install
mkdir -p .claude/skills/firecrawl-security-basics && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/5495" && unzip -o skill.zip -d .claude/skills/firecrawl-security-basics && rm skill.zipInstalls to .claude/skills/firecrawl-security-basics
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Apply Firecrawl security best practices for API key management and webhookKey capabilities
- →Secure API keys in environment variables
- →Verify webhook HMAC-SHA256 signatures
- →Rotate API keys
- →Sanitize scraped content to prevent XSS
- →Separate keys by environment
How it works
It provides security patterns for credential management and input validation to protect against unauthorized access and malicious content.
Inputs & outputs
When to use firecrawl-security-basics
- →Securing Firecrawl API keys
- →Implementing webhook signature validation
- →Auditing integration security configuration
About this skill
Firecrawl Security Basics
Overview
Security best practices for Firecrawl API keys, webhook signature verification, and scraped content handling. Firecrawl API keys start with fc- and grant full access to scrape, crawl, map, and extract endpoints — protecting them is critical.
Prerequisites
- Firecrawl API key
- Understanding of environment variables
- Webhook endpoint (if using async crawl callbacks)
Instructions
Step 1: Secure API Key Storage
# .env (NEVER commit to git)
FIRECRAWL_API_KEY=fc-your-api-key-here
# .gitignore — add these patterns
echo -e "\n.env\n.env.local\n.env.*.local" >> .gitignore
// Validate key exists before creating client
import FirecrawlApp from "@mendable/firecrawl-js";
if (!process.env.FIRECRAWL_API_KEY?.startsWith("fc-")) {
throw new Error("FIRECRAWL_API_KEY must be set and start with 'fc-'");
}
const firecrawl = new FirecrawlApp({
apiKey: process.env.FIRECRAWL_API_KEY,
});
Step 2: Verify Webhook Signatures
Firecrawl signs webhook payloads with HMAC-SHA256 via the X-Firecrawl-Signature header.
import crypto from "crypto";
function verifyWebhookSignature(
payload: string,
signature: string,
secret: string
): boolean {
const expected = crypto
.createHmac("sha256", secret)
.update(payload)
.digest("hex");
// Timing-safe comparison prevents timing attacks
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
);
}
// Express webhook handler with verification
app.post("/webhooks/firecrawl", (req, res) => {
const signature = req.headers["x-firecrawl-signature"] as string;
const rawBody = JSON.stringify(req.body);
if (!verifyWebhookSignature(rawBody, signature, process.env.FIRECRAWL_WEBHOOK_SECRET!)) {
console.error("Invalid webhook signature — rejecting");
return res.status(401).json({ error: "Invalid signature" });
}
// Process verified webhook
const { type, data } = req.body;
console.log(`Verified webhook: ${type}`);
res.status(200).json({ received: true });
});
Step 3: Separate Keys per Environment
# GitHub Actions secrets
gh secret set FIRECRAWL_API_KEY_DEV --body "fc-dev-..."
gh secret set FIRECRAWL_API_KEY_STAGING --body "fc-staging-..."
gh secret set FIRECRAWL_API_KEY_PROD --body "fc-prod-..."
// Load correct key based on environment
const KEY_MAP: Record<string, string> = {
development: "FIRECRAWL_API_KEY_DEV",
staging: "FIRECRAWL_API_KEY_STAGING",
production: "FIRECRAWL_API_KEY_PROD",
};
const envVar = KEY_MAP[process.env.NODE_ENV || "development"];
const apiKey = process.env[envVar] || process.env.FIRECRAWL_API_KEY;
Step 4: Rotate Keys
set -euo pipefail
# 1. Generate new key at firecrawl.dev/app
# 2. Deploy new key alongside old key
# 3. Verify new key works
curl -s https://api.firecrawl.dev/v1/scrape \
-H "Authorization: Bearer $NEW_FIRECRAWL_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com","formats":["markdown"]}' | jq .success
# 4. Remove old key from all environments
# 5. Delete old key in Firecrawl dashboard
Step 5: Sanitize Scraped Content
// Scraped web content may contain PII, scripts, or malicious data
function sanitizeScrapedContent(markdown: string): string {
return markdown
// Remove potential script injections
.replace(/<script[\s\S]*?<\/script>/gi, "")
// Remove data URIs (potential XSS vectors)
.replace(/!\[.*?\]\(data:.*?\)/g, "")
// Remove javascript: links
.replace(/\[.*?\]\(javascript:.*?\)/g, "")
// Strip HTML comments
.replace(/<!--[\s\S]*?-->/g, "")
.trim();
}
Security Checklist
- API key stored in environment variable, never hardcoded
-
.envfiles listed in.gitignore - Different keys for dev/staging/production
- Webhook signatures verified before processing
- Scraped content sanitized before storage/display
- Key rotation scheduled quarterly
- Git history scanned for leaked keys
Error Handling
| Security Issue | Detection | Mitigation |
|---|---|---|
| Leaked API key in git | git log -p | grep "fc-" | Rotate immediately, revoke old key |
| Invalid webhook signature | Signature verification fails | Reject request, alert team |
| Excessive scraping costs | Credit alerts from Firecrawl | Set credit limits per key |
| PII in scraped content | Content scanning | Sanitize before storage |
Resources
Next Steps
For production deployment, see firecrawl-prod-checklist.
When not to use it
- →When using hardcoded credentials in production
- →When ignoring webhook signature verification for public endpoints
Prerequisites
Limitations
- →Requires manual implementation of sanitization logic
- →Webhook verification requires a shared secret
How it compares
This approach implements proactive security measures like HMAC verification and content sanitization instead of trusting raw API responses.
Compared to similar skills
firecrawl-security-basics side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| firecrawl-security-basics (this skill) | 1 | 27d | Caution | Intermediate |
| auth-patterns | 7 | 7mo | Review | Intermediate |
| clerk-incident-runbook | 1 | 27d | Caution | Intermediate |
| customerio-security-basics | 1 | 27d | Review | Intermediate |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by jeremylongshore
View all by jeremylongshore →You might also like
auth-patterns
davepoon
This skill should be used when the user asks about "authentication in Next.js", "NextAuth", "Auth.js", "middleware auth", "protected routes", "session management", "JWT", "login flow", or needs guidance on implementing authentication and authorization in Next.js applications.
clerk-incident-runbook
jeremylongshore
Incident response procedures for Clerk authentication issues. Use when handling auth outages, security incidents, or production authentication problems. Trigger with phrases like "clerk incident", "clerk outage", "clerk down", "auth not working", "clerk emergency".
customerio-security-basics
jeremylongshore
Apply Customer.io security best practices. Use when implementing secure integrations, handling PII, or setting up proper access controls. Trigger with phrases like "customer.io security", "customer.io pii", "secure customer.io", "customer.io gdpr".
gamma-enterprise-rbac
jeremylongshore
Implement enterprise role-based access control for Gamma integrations. Use when configuring team permissions, multi-tenant access, or enterprise authorization patterns. Trigger with phrases like "gamma RBAC", "gamma permissions", "gamma access control", "gamma enterprise", "gamma roles".
jwt-auth
dadbodgeoff
Implement secure JWT authentication with refresh token rotation, secure storage, and automatic renewal. Use when building authentication for SPAs, mobile apps, or APIs that need stateless auth with refresh capabilities.
maintainx-security-basics
jeremylongshore
Configure MaintainX API security, credential management, and access control. Use when securing API keys, implementing access controls, or hardening your MaintainX integration. Trigger with phrases like "maintainx security", "maintainx api key security", "secure maintainx", "maintainx credentials", "maintainx access control".