Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Install the exa-js SDK and configure API key authentication. Use when setting up a new Exa integration, configuring API keys, or initializing Exa in a Node.js/Python project. Trigger with phrases like "install exa", "setup exa", "exa auth", "configure exa API key", "exa-js".
.claude/skills/jeremylongshore-exa-install-auth/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-13 | ✗→✓ | ▲ Improved | -4% | 0% |
| case-01 | ✓→✓ | = Same ✓ | 195% | 0% |
| case-02 | ✓→✓ | = Same ✓ | 175% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 219% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 134% | 0% |
Install the official Exa SDK and configure API key authentication. Exa is a neural search API at api.exa.ai that retrieves web content using semantic similarity. Authentication uses the x-api-key header. The SDK is exa-js on npm or exa-py on PyPI.
Node.js (exa-js)
bashset -euo pipefail npm install exa-js # or pnpm add exa-js
Python (exa-py)
bashpip install exa-py
bash# Set environment variable export EXA_API_KEY="your-api-key-here" # Or create .env file (add .env to .gitignore first) echo 'EXA_API_KEY=your-api-key-here' >> .env
Add to .gitignore:
.env
.env.local
.env.*.localTypeScript
typescriptimport Exa from "exa-js"; const exa = new Exa(process.env.EXA_API_KEY);
Python
pythonfrom exa_py import Exa import os exa = Exa(api_key=os.environ["EXA_API_KEY"])
typescriptimport Exa from "exa-js"; const exa = new Exa(process.env.EXA_API_KEY); async function verifyConnection() { try { const result = await exa.search("test connectivity", { numResults: 1 }); console.log("Connected. Results:", result.results.length); console.log("First result:", result.results[0]?.title); } catch (err: any) { if (err.status === 401) { console.error("Invalid API key. Check EXA_API_KEY."); } else if (err.status === 402) { console.error("No credits remaining. Top up at dashboard.exa.ai."); } else { console.error("Connection failed:", err.message); } } } verifyConnection();
exa-js or exa-py installed in project dependenciesEXA_API_KEY environment variable configured.env added to .gitignore| Error | HTTP Code | Cause | Solution | |-------|-----------|-------|----------| | INVALID_API_KEY | 401 | Missing or invalid API key | Verify key at dashboard.exa.ai | | NO_MORE_CREDITS | 402 | Account balance exhausted | Top up credits in dashboard | | MODULE_NOT_FOUND | N/A | SDK not installed | Run npm install exa-js | | ENOTFOUND | N/A | Network unreachable | Check internet connectivity | | API_KEY_BUDGET_EXCEEDED | 402 | Spending limit reached | Increase budget in dashboard |
typescriptimport "dotenv/config"; import Exa from "exa-js"; const exa = new Exa(process.env.EXA_API_KEY);
typescriptfunction createExaClient(): Exa { const apiKey = process.env.EXA_API_KEY; if (!apiKey) { throw new Error( "EXA_API_KEY not set. Get one at https://dashboard.exa.ai" ); } return new Exa(apiKey); }
After successful auth, proceed to exa-hello-world for your first search.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | pass→pass | 5,481 | 13,652 | +149% | 1 | 1 | 0% | 480 | 1,417 | +195% | 0 | 0 | — |
case-02 | pass→pass | 3,629 | 1,804 | -50% | 1 | 1 | 0% | 496 | 1,366 | +175% | 0 | 0 | — |
case-03 | pass→pass | 3,321 | 5,708 | +72% | 1 | 1 | 0% | 563 | 1,796 | +219% | 0 | 0 | — |
case-04 | pass→pass | 8,368 | 2,606 | -69% | 1 | 1 | 0% | 606 | 1,419 | +134% | 0 | 0 | — |
case-05 | pass→pass | 7,176 | 8,010 | +12% | 1 | 1 | 0% | 1,392 | 2,402 | +73% | 0 | 0 | — |
case-06 | pass→pass | 7,826 | 4,502 | -42% | 1 | 1 | 0% | 1,195 | 1,916 | +60% | 0 | 0 | — |
case-07 | pass→pass | 8,545 | 9,811 | +15% | 1 | 1 | 0% | 1,575 | 2,414 | +53% | 0 | 0 | — |
case-08 | pass→pass | 7,555 | 8,466 | +12% | 1 | 1 | 0% | 1,496 | 2,221 | +48% | 0 | 0 | — |
case-09 | pass→pass | 9,128 | 4,489 | -51% | 1 | 1 | 0% | 1,317 | 1,932 | +47% | 0 | 0 | — |
case-10 | pass→pass | 6,506 | 3,563 | -45% | 1 | 1 | 0% | 1,115 | 1,657 | +49% | 0 | 0 | — |
case-11 | pass→pass | 8,278 | 4,042 | -51% | 1 | 1 | 0% | 1,118 | 1,698 | +52% | 0 | 0 | — |
case-12 | pass→pass | 7,779 | 3,544 | -54% | 1 | 1 | 0% | 1,099 | 1,648 | +50% | 0 | 0 | — |
case-13 | fail→pass | 10,020 | 2,580 | -74% | 1 | 1 | 0% | 1,430 | 1,367 | -4% | 0 | 0 | — |
case-14 | pass→pass | 3,386 | 2,789 | -18% | 1 | 1 | 0% | 602 | 1,442 | +140% | 0 | 0 | — |
case-15 | pass→pass | 6,230 | 3,896 | -37% | 1 | 1 | 0% | 714 | 1,624 | +127% | 0 | 0 | — |
case-16 | pass→pass | 9,401 | 8,078 | -14% | 1 | 1 | 0% | 1,616 | 2,725 | +69% | 0 | 0 | — |
case-17 | pass→pass | 13,832 | 4,775 | -65% | 1 | 1 | 0% | 2,448 | 1,930 | -21% | 0 | 0 | — |
case-18 | pass→pass | 7,944 | 6,401 | -19% | 1 | 1 | 0% | 1,064 | 1,944 | +83% | 0 | 0 | — |
case-19 | pass→pass | 3,625 | 2,269 | -37% | 1 | 1 | 0% | 608 | 1,368 | +125% | 0 | 0 | — |
case-20 | pass→pass | 7,399 | 6,669 | -10% | 1 | 1 | 0% | 1,425 | 2,182 | +53% | 0 | 0 | — |
case-21 | pass→pass | 7,954 | 7,819 | -2% | 1 | 1 | 0% | 1,135 | 2,227 | +96% | 0 | 0 | — |
case-22 | pass→pass | 3,127 | 2,861 | -9% | 1 | 1 | 0% | 453 | 1,518 | +235% | 0 | 0 | — |
case-23 | pass→pass | 8,610 | 6,278 | -27% | 1 | 1 | 0% | 1,614 | 2,157 | +34% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +4 percentage points is the difference between those two pass rates over the 23 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.