Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Install and configure the Algolia JavaScript v5 client with proper API key management. Use when setting up a new Algolia integration, configuring Application ID and API keys, or initializing the algoliasearch client in a Node.js/TypeScript project. Trigger: "install algolia", "setup algolia", "algolia auth", "configure algolia keys".
.claude/skills/jeremylongshore-algolia-install-auth/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 6% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 31% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 39% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 62% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 24% | 0% |
Set up the algoliasearch v5 JavaScript client with Application ID and API key authentication. Algolia uses a two-key system: an Application ID (identifies your app) and an API key (controls permissions). Every Algolia account has three default keys: Search-Only, Admin, and Monitoring.
bash# Full client (Search + Analytics + Recommend + A/B Testing + Personalization) npm install algoliasearch # Or search-only (lighter bundle, frontend use) npm install algoliasearch # then import { liteClient } from 'algoliasearch/lite' # Or individual API clients if you only need one npm install @algolia/client-search npm install @algolia/client-analytics npm install @algolia/recommend
bash# .env (NEVER commit — add to .gitignore) ALGOLIA_APP_ID=YourApplicationID ALGOLIA_ADMIN_KEY=your_admin_api_key ALGOLIA_SEARCH_KEY=your_search_only_api_key # .gitignore .env .env.local .env.*.local
Key types and when to use them:
| Key Type | ACL Permissions | Use In | |----------|----------------|--------| | Search-Only | search | Frontend, mobile apps | | Admin | All operations | Backend only, never expose | | Monitoring | GET /1/status | Health checks | | Custom | You define ACL | Scoped backend services |
typescript// src/algolia/client.ts import { algoliasearch } from 'algoliasearch'; // Backend — Admin client for indexing operations const client = algoliasearch( process.env.ALGOLIA_APP_ID!, process.env.ALGOLIA_ADMIN_KEY! ); // Frontend — Search-only client (safe to expose) import { liteClient } from 'algoliasearch/lite'; const searchClient = liteClient( process.env.NEXT_PUBLIC_ALGOLIA_APP_ID!, process.env.NEXT_PUBLIC_ALGOLIA_SEARCH_KEY! );
typescript// Quick verification: list indices async function verifyAlgoliaConnection() { try { const { items } = await client.listIndices(); console.log(`Connected. Found ${items.length} indices.`); return true; } catch (error) { console.error('Algolia connection failed:', error); return false; } } await verifyAlgoliaConnection();
The project has a v5 Algolia client configured with the correct application ID and least-privileged key for its environment. The verification request confirms connectivity without exposing an Admin key to browser code.
| Error | HTTP Code | Cause | Solution | |-------|-----------|-------|----------| | Invalid Application-ID or API key | 403 | Wrong App ID or key | Copy fresh values from dashboard > Settings > API Keys | | Index does not exist | 404 | Querying non-existent index | Create index first with saveObjects | | Method not allowed | 405 | Search-only key used for write op | Use Admin key for indexing operations | | RetryError: Unreachable hosts | N/A | Network/DNS issue | Check firewall allows *.algolia.net and *.algolianet.com | | Record quota exceeded | 429 | Plan limit hit | Upgrade plan or delete unused records |
typescript// src/algolia/client.ts import { algoliasearch, type Algoliasearch } from 'algoliasearch'; let _client: Algoliasearch | null = null; export function getAlgoliaClient(): Algoliasearch { if (!_client) { const appId = process.env.ALGOLIA_APP_ID; const apiKey = process.env.ALGOLIA_ADMIN_KEY; if (!appId || !apiKey) { throw new Error('Missing ALGOLIA_APP_ID or ALGOLIA_ADMIN_KEY env vars'); } _client = algoliasearch(appId, apiKey); } return _client; }
typescriptimport { algoliasearch } from 'algoliasearch'; // Generate a secured API key that restricts search to specific filters const client = algoliasearch(appId, adminKey); const securedKey = client.generateSecuredApiKey({ parentApiKey: searchOnlyKey, restrictions: { filters: 'tenant_id:acme_corp', validUntil: Math.floor(Date.now() / 1000) + 3600, // 1 hour restrictIndices: ['products_acme'], }, });
After successful auth, proceed to algolia-hello-world for your first index and search.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-12 | pass→pass | 12,852 | 26,611 | +107% | 1 | 1 | 0% | 2,216 | 3,335 | +50% | 0 | 0 | — |
case-22 | pass→pass | 10,416 | 10,173 | -2% | 1 | 1 | 0% | 2,005 | 3,352 | +67% | 0 | 0 | — |
case-01 | fail→pass | 43,842 | 37,367 | -15% | 1 | 1 | 0% | 2,620 | 2,777 | +6% | 0 | 0 | — |
case-02 | fail→pass | 17,396 | 42,279 | +143% | 1 | 1 | 0% | 2,975 | 3,904 | +31% | 0 | 0 | — |
case-03 | pass→pass | 14,583 | 13,675 | -6% | 1 | 1 | 0% | 2,470 | 3,730 | +51% | 0 | 0 | — |
case-04 | pass→pass | 8,724 | 8,633 | -1% | 1 | 1 | 0% | 1,657 | 3,034 | +83% | 0 | 0 | — |
case-05 | pass→pass | 12,942 | 10,052 | -22% | 1 | 1 | 0% | 2,374 | 3,177 | +34% | 0 | 0 | — |
case-06 | pass→pass | 42,549 | 39,321 | -8% | 1 | 1 | 0% | 1,832 | 3,124 | +71% | 0 | 0 | — |
case-07 | fail→pass | 12,543 | 6,641 | -47% | 1 | 1 | 0% | 1,927 | 2,684 | +39% | 0 | 0 | — |
case-08 | fail→pass | 9,659 | 7,495 | -22% | 1 | 1 | 0% | 1,627 | 2,630 | +62% | 0 | 0 | — |
case-09 | fail→pass | 14,293 | 9,635 | -33% | 1 | 1 | 0% | 2,626 | 3,261 | +24% | 0 | 0 | — |
case-10 | fail→pass | 17,038 | 5,990 | -65% | 1 | 1 | 0% | 2,724 | 2,421 | -11% | 0 | 0 | — |
case-11 | pass→pass | 10,295 | 9,492 | -8% | 1 | 1 | 0% | 1,739 | 3,035 | +75% | 0 | 0 | — |
case-13 | fail→pass | 12,408 | 10,774 | -13% | 1 | 1 | 0% | 2,183 | 3,361 | +54% | 0 | 0 | — |
case-14 | pass→pass | 16,812 | 7,709 | -54% | 1 | 1 | 0% | 1,823 | 2,667 | +46% | 0 | 0 | — |
case-15 | fail→fail | 6,371 | 3,924 | -38% | 1 | 1 | 0% | 1,144 | 2,017 | +76% | 0 | 0 | — |
case-16 | pass→pass | 4,588 | 12,757 | +178% | 1 | 1 | 0% | 648 | 1,661 | +156% | 0 | 0 | — |
case-17 | pass→pass | 10,302 | 5,377 | -48% | 1 | 1 | 0% | 2,038 | 2,449 | +20% | 0 | 0 | — |
case-18 | pass→pass | 7,330 | 7,023 | -4% | 1 | 1 | 0% | 1,472 | 2,713 | +84% | 0 | 0 | — |
case-19 | pass→pass | 6,492 | 3,429 | -47% | 1 | 1 | 0% | 1,116 | 2,021 | +81% | 0 | 0 | — |
case-20 | pass→pass | 8,641 | 2,925 | -66% | 1 | 1 | 0% | 1,513 | 1,928 | +27% | 0 | 0 | — |
case-21 | fail→pass | 14,581 | 4,499 | -69% | 1 | 1 | 0% | 2,681 | 2,076 | -23% | 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. 22 cases were attempted. The headline lift of +36 percentage points is the difference between those two pass rates over the 22 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.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 8/13/2026 | +27% |
Other measured skills in the registry, with their headline benchmark lift.