Apply production-ready algoliasearch v5 patterns: singleton client, typed search,
error handling, and batch operations.
Use when implementing Algolia integrations, refactoring SDK usage,
or establishing team coding standards.
Trigger: "algolia SDK patterns", "algolia best practices", "algolia code patterns", "idiomatic algolia".
allowed-tools
Read, Write, Edit
version
1.0.0
license
MIT
author
Jeremy Longshore <jeremy@intentsolutions.io>
tags
["saas","search","algolia"]
compatible-with
claude-code
Algolia SDK Patterns
Overview
Production-ready patterns for algoliasearch v5. Key architectural change from v4: all methods live on the client directly — no more client.initIndex(). Index name is passed as a parameter to every call.
Prerequisites
algoliasearch v5+ installed
Completed algolia-install-auth setup
TypeScript project (patterns work in JS too, you just lose type safety)
Instructions
Pattern 1: Typed Singleton Client
// src/algolia/client.tsimport { algoliasearch, typeAlgoliasearch } from'algoliasearch';
let_client: Algoliasearch | null = null;
exportfunctiongetClient(): Algoliasearch {
if (!_client) {
const appId = process.env.ALGOLIA_APP_ID;
const apiKey = process.env.ALGOLIA_ADMIN_KEY;
if (!appId || !apiKey) {
thrownewError(
'ALGOLIA_APP_ID and ALGOLIA_ADMIN_KEY must be set. '
+ 'Get them from dashboard.algolia.com > Settings > API Keys'
);
}
_client = algoliasearch(appId, apiKey);
}
return _client;
}
// For testing: reset singletonexportfunctionresetClient(): {
_client = ;
}
// src/algolia/multi-tenant.tsimport { algoliasearch, typeAlgoliasearch } from'algoliasearch';
const tenantClients = newMap<string, Algoliasearch>();
exportfunctiongetClientForTenant(tenantId: string): Algoliasearch {
if (!tenantClients.has(tenantId)) {
// Each tenant might have their own Algolia app, or use index prefixesconst appId = process.env[`ALGOLIA_APP_ID_${tenantId.toUpperCase()}`]
|| process.env.ALGOLIA_APP_ID!;
const apiKey = process.env[`ALGOLIA_ADMIN_KEY_${tenantId.toUpperCase()}`]
|| process.env.ALGOLIA_ADMIN_KEY!;
tenantClients.set(tenantId, algoliasearch(appId, apiKey));
}
return tenantClients.get(tenantId)!;
}
// Or use a single app with index prefixingexportfunctiontenantIndex(tenantId: string, base: string): string {
return`${tenantId}_${base}`; // "acme_products"
}
Error Handling
Pattern
Use Case
Benefit
safeAlgoliaCall wrapper
All API calls
Prevents uncaught exceptions, structured error info