exa-common-errors
Troubleshoot Exa API errors using status codes like 400 and 401 for quick resolution.
Install
mkdir -p .claude/skills/exa-common-errors && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/6310" && unzip -o skill.zip -d .claude/skills/exa-common-errors && rm skill.zipInstalls to .claude/skills/exa-common-errors
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.
Diagnose and fix Exa API errors by HTTP code and error tag.Key capabilities
- →Diagnose Exa API errors by HTTP status code
- →Map error tags to specific troubleshooting actions
- →Validate API key connectivity via curl
- →Implement exponential backoff for rate limit handling
- →Retrieve request IDs for support inquiries
How it works
This skill provides a reference mapping between Exa API error codes and specific remediation steps, supplemented by a diagnostic script to verify API connectivity.
Inputs & outputs
When to use exa-common-errors
- →Debug 400 errors
- →Validate API keys
- →Check query parameters
About this skill
Exa Common Errors
Overview
Quick reference for Exa API errors by HTTP status code and error tag. All error responses include a requestId field — include it when contacting Exa support at [email protected].
Error Reference
400 — Bad Request
| Error Tag | Cause | Solution |
|---|---|---|
INVALID_REQUEST_BODY | Malformed JSON or missing required fields | Validate JSON structure and required query field |
INVALID_REQUEST | Conflicting parameters | Remove contradictory options (e.g., date filters with company category) |
INVALID_URLS | Malformed URLs in getContents | Ensure URLs have https:// protocol |
INVALID_NUM_RESULTS | numResults > 100 with highlights | Reduce to <= 100 or remove highlights |
INVALID_JSON_SCHEMA | Bad schema in summary.schema | Validate JSON schema syntax |
NUM_RESULTS_EXCEEDED | Exceeds plan limit | Check your plan's max results |
NO_CONTENT_FOUND | No content at provided URLs | Verify URLs are accessible |
401 — Unauthorized
# Verify your API key is set and valid
echo "Key set: ${EXA_API_KEY:+yes}"
# Test with curl
curl -s -o /dev/null -w "%{http_code}" \
-X POST https://api.exa.ai/search \
-H "x-api-key: $EXA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query":"test","numResults":1}'
Fix: Regenerate API key at dashboard.exa.ai.
402 — Payment Required
| Error Tag | Cause | Solution |
|---|---|---|
NO_MORE_CREDITS | Account balance exhausted | Top up at dashboard.exa.ai |
API_KEY_BUDGET_EXCEEDED | Spending limit reached | Increase budget in API key settings |
403 — Forbidden
| Error Tag | Cause | Solution |
|---|---|---|
ACCESS_DENIED | Feature not available on plan | Upgrade plan or contact Exa |
FEATURE_DISABLED | Endpoint not enabled | Check plan capabilities |
ROBOTS_FILTER_FAILED | URL blocked by robots.txt | Use a different URL |
PROHIBITED_CONTENT | Content blocked by moderation | Review query for policy violations |
429 — Rate Limited
// Default rate limit: 10 QPS (queries per second)
// Error response format: { "error": "rate limit exceeded" }
// Fix: implement exponential backoff
async function searchWithBackoff(exa: Exa, query: string, opts: any) {
for (let attempt = 0; attempt < 5; attempt++) {
try {
return await exa.search(query, opts);
} catch (err: any) {
if (err.status !== 429) throw err;
const delay = 1000 * Math.pow(2, attempt) + Math.random() * 500;
console.log(`Rate limited. Waiting ${delay.toFixed(0)}ms...`);
await new Promise(r => setTimeout(r, delay));
}
}
throw new Error("Rate limit retries exhausted");
}
422 — Unprocessable Entity
| Error Tag | Cause | Solution |
|---|---|---|
FETCH_DOCUMENT_ERROR | URL could not be crawled | Verify URL is accessible and not paywalled |
5xx — Server Errors
| Code | Tag | Action |
|---|---|---|
| 500 | DEFAULT_ERROR / INTERNAL_ERROR | Retry after 1-2 seconds |
| 501 | UNABLE_TO_GENERATE_RESPONSE | Rephrase query (answer endpoint) |
| 502 | Bad Gateway | Retry with delay |
| 503 | Service Unavailable | Check status page, retry later |
Content Fetch Errors (per-URL status in getContents)
| Tag | Cause | Resolution |
|---|---|---|
CRAWL_NOT_FOUND | Content unavailable at URL | Verify URL correctness |
CRAWL_TIMEOUT | Fetch timed out | Retry or increase livecrawlTimeout |
CRAWL_LIVECRAWL_TIMEOUT | Live crawl exceeded timeout | Set livecrawlTimeout: 15000 or use livecrawl: "fallback" |
SOURCE_NOT_AVAILABLE | Paywalled or blocked | Try cached content with livecrawl: "never" |
UNSUPPORTED_URL | Non-HTTP URL scheme | Use standard HTTPS URLs |
Quick Diagnostic Script
set -euo pipefail
echo "=== Exa Diagnostics ==="
echo "API Key: ${EXA_API_KEY:+SET (${#EXA_API_KEY} chars)}"
# Test basic connectivity
echo -n "API connectivity: "
HTTP_CODE=$(curl -s -o /tmp/exa-test.json -w "%{http_code}" \
-X POST https://api.exa.ai/search \
-H "x-api-key: $EXA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query":"connectivity test","numResults":1}')
echo "$HTTP_CODE"
if [ "$HTTP_CODE" != "200" ]; then
echo "Error response:"
cat /tmp/exa-test.json | python3 -m json.tool 2>/dev/null || cat /tmp/exa-test.json
fi
Instructions
- Check the HTTP status code from the error response
- Match the error tag to the tables above
- Apply the documented solution
- Include
requestIdfrom error responses when contacting support
Resources
Next Steps
For comprehensive debugging, see exa-debug-bundle. For rate limit patterns, see exa-rate-limits.
When not to use it
- →When the error is unrelated to the Exa API
- →When the issue is a local network failure
Prerequisites
Limitations
- →Requires manual intervention for most error resolutions
- →Diagnostic script is limited to basic connectivity testing
How it compares
Unlike generic debugging, this provides specific error-tag-to-solution mappings tailored to the Exa API response structure.
Compared to similar skills
exa-common-errors side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| exa-common-errors (this skill) | 1 | 27d | Review | Beginner |
| n8n-expression-syntax | 6 | 4mo | No flags | Beginner |
| claude-in-chrome-troubleshooting | 2 | 2mo | Review | Intermediate |
| openrouter-common-errors | 3 | 27d | Caution | Intermediate |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by jeremylongshore
View all by jeremylongshore →You might also like
n8n-expression-syntax
czlonkowski
Validate n8n expression syntax and fix common errors. Use when writing n8n expressions, using {{}} syntax, accessing $json/$node variables, troubleshooting expression errors, or working with webhook data in workflows.
claude-in-chrome-troubleshooting
trailofbits
Diagnose and fix Claude in Chrome MCP extension connectivity issues. Use when mcp__claude-in-chrome__* tools fail, return "Browser extension is not connected", or behave erratically.
openrouter-common-errors
jeremylongshore
Execute diagnose and fix common OpenRouter API errors. Use when troubleshooting failed requests. Trigger with phrases like 'openrouter error', 'openrouter not working', 'openrouter 401', 'openrouter 429', 'fix openrouter'.
linear-common-errors
jeremylongshore
Diagnose and fix common Linear API errors. Use when encountering Linear API errors, debugging integration issues, or troubleshooting authentication problems. Trigger with phrases like "linear error", "linear API error", "debug linear", "linear not working", "linear authentication error".
gamma-common-errors
jeremylongshore
Debug and resolve common Gamma API errors. Use when encountering authentication failures, rate limits, generation errors, or unexpected API responses. Trigger with phrases like "gamma error", "gamma not working", "gamma API error", "gamma debug", "gamma troubleshoot".
groq-common-errors
jeremylongshore
Diagnose and fix Groq common errors and exceptions. Use when encountering Groq errors, debugging failed requests, or troubleshooting integration issues. Trigger with phrases like "groq error", "fix groq", "groq not working", "debug groq".