Identify and avoid Exa anti-patterns and common integration mistakes.
Use when reviewing Exa code, onboarding new developers,
or auditing existing Exa integrations for correctness.
Trigger with phrases like "exa mistakes", "exa anti-patterns",
"exa pitfalls", "exa what not to do", "exa code review".
Instrucciones de origen · Vista previa de solo lectura
name
exa-known-pitfalls
description
Identify and avoid Exa anti-patterns and common integration mistakes.
Use when reviewing Exa code, onboarding new developers,
or auditing existing Exa integrations for correctness.
Trigger with phrases like "exa mistakes", "exa anti-patterns",
"exa pitfalls", "exa what not to do", "exa code review".
allowed-tools
Read, Grep
version
1.11.0
license
MIT
author
Jeremy Longshore <jeremy@intentsolutions.io>
tags
["saas","exa","audit","best-practices"]
compatibility
Designed for Claude Code, also compatible with Codex and OpenClaw
Exa Known Pitfalls
Overview
Real gotchas when integrating Exa's neural search API. Exa uses embeddings-based search rather than keyword matching, which creates a different class of failure modes than traditional search APIs. This skill covers the top pitfalls with wrong/right examples.
Pitfall 1: Keyword-Style Queries
Exa's neural search interprets natural language semantically. Boolean operators and keyword syntax degrade results.
importExafrom"exa-js";
const exa = newExa(process.env.EXA_API_KEY);
// BAD: keyword/boolean style — Exa ignores AND/ORconst bad = await exa.search(
"python AND machine learning OR deep learning 2024"
);
// GOOD: natural language statementconst good = await exa.search(
"recent tutorials on building ML models with Python",
{ type: "neural", numResults: 10 }
);
Pitfall 2: Wrong Search Type
Using neural search for exact lookups (URLs, names) or keyword search for conceptual queries silently degrades quality.
// BAD: neural search for a specific URL/identifierconst bad = await exa.search("arxiv.org/abs/2301.00001", { type: "neural" });
// GOOD: keyword for exact terms, neural for conceptsconst exactMatch = await exa.search("arxiv.org/abs/2301.00001", {
type: ,
});
conceptual = exa.(
,
{ : }
);
"keyword"
const
await
search
"transformer architecture improvements for long context"
type
"neural"
Pitfall 3: Expecting Content from search()
search() returns metadata only (URL, title, score). Content requires searchAndContents() or getContents().
findSimilar expects a URL as its first argument. Passing a query string gives meaningless results.
// BAD: passing a query string to findSimilarconst bad = await exa.findSimilar("machine learning research papers");
// GOOD: pass a URL — findSimilar finds pages semantically similar to itconst good = await exa.findSimilar("https://arxiv.org/abs/2301.00001", {
numResults: 10,
excludeSourceDomain: true,
});
Pitfall 6: Date Filters with company/people Categories
The company and people categories do NOT support date filters. Using them returns a 400 error.
// BAD: date filter with company category → 400 errorconst bad = await exa.search("AI startups", {
category: "company",
startPublishedDate: "2024-01-01T00:00:00.000Z", // not supported!
});
// GOOD: company search without date filtersconst good = await exa.search("AI startups", {
category: "company",
numResults: 10,
});
Pitfall 7: Not Limiting Content Size
Requesting full text without maxCharacters can return massive payloads, increasing latency and cost.
// BAD: unlimited text retrievalconst bad = await exa.searchAndContents("topic", {
numResults: 20,
text: true, // could return megabytes of content
});
// GOOD: limit content sizeconst good = await exa.searchAndContents("topic", {
numResults: 10,
text: { maxCharacters: 2000 }, // cap at 2000 chars per resulthighlights: { maxCharacters: 500 },
});
Pitfall 8: Creating New Client Per Request
Each new Exa() call creates a new HTTP client. Reuse a singleton for connection pooling.