19 KiB
TypeSense API Complete Documentation
Overview
TypeSense is an open-source, typo-tolerant search engine designed for fast, instant search experiences. Built from the ground up in C++, it offers millisecond response times with intelligent default behaviors for search-as-you-type experiences.
Key Features
- Open Source: Free to use and modify (besides infrastructure costs)
- RAM-Based Indexing: Entire dataset should fit in RAM for optimal performance
- Typo Tolerance: Built-in fuzzy matching and typo correction
- Instant Search: Millisecond response times for typical queries
- Privacy-Friendly: Does not collect usage analytics or personal data
- No Record Limits: Only constrained by available RAM (up to 24 TB)
Authentication
API Key Authentication
TypeSense uses API key authentication for secure access control.
Method: Header-Based
curl -H "X-TYPESENSE-API-KEY: {api_key}" \
"https://{host}/collections/{collection}/documents/search"
Configuration in Supapress Plugin
function supapress_set_typesense_client() {
$apiKey = (string)get_option('typesense_api_key');
$host = (string)get_option('typesense_host');
$client = new Client([
'nodes' => [
[
'host' => $host,
'port' => '',
'protocol' => 'https'
]
],
'api_key' => $apiKey,
'connection_timeout_seconds' => 2
]);
return $client;
}
Required Settings
typesense_api_key: API authentication keytypesense_host: TypeSense server URL (without protocol)typesense_catalog: Collection name for book data
Activation
define('TYPESENSE_API', true); // Enable TypeSense in Supapress
Complete API Endpoints Reference
1. Search Endpoint
Endpoint: GET /collections/{collection}/documents/search
Purpose: Primary search operation for finding documents based on text queries, filters, and faceting.
Complete Parameter Reference
Query Parameters
| Parameter | Required | Description | Default | Example |
|---|---|---|---|---|
q |
yes | The query text to search for | "javascript programming" |
|
query_by |
yes | Fields to search within | "title,description" |
|
prefix |
no | Enable prefix searching | true |
|
infix |
no | Enable infix search | false |
|
pre_segmented_query |
no | Handle query segmentation manually | false |
|
num_typos |
no | Max typographical errors tolerated | 2 |
|
min_len_1typo |
no | Min word length for 1 typo | 4 |
|
min_len_2typo |
no | Min word length for 2 typos | 7 |
|
drop_tokens_threshold |
no | Drop words if insufficient results | 1 |
|
typo_tokens_threshold |
no | Start typo correction after N results | 1 |
|
enable_typos_for_numerical_tokens |
no | Enable typos on numerical tokens | true |
|
enable_typos_for_alpha_numerical_tokens |
no | Enable typos on alphanumerical tokens | true |
|
synonym_num_typos |
no | Allow synonym resolution on typos | 0 |
|
split_join_tokens |
no | Treat space as typo | fallback |
|
drop_tokens_mode |
no | Direction of word dropping | right_to_left |
|
max_candidates |
no | Similar words considered for prefix/typo | 4 |
|
max_extra_prefix |
no | Max symbols before/after query | 4 |
|
max_extra_suffix |
no | Max symbols before/after query | 4 |
|
preset |
no | Preset configuration name | ||
vector_query |
no | Vector search query | ||
voice_query |
no | Base64 encoded speech | ||
stopwords |
no | Comma-separated stopword sets | ||
validate_field_names |
no | Validate field existence | true |
Filter Parameters
| Parameter | Description | Example |
|---|---|---|
filter_by |
Complex filtering expressions | country: USA |
| Exact match vs non-exact | ||
| Multiple values | ||
| Negation | ||
| Numeric ranges | ||
| Multiple conditions | ||
| OR conditions | ||
| Array filtering | ||
| Nested object filtering | ||
| Prefix filtering | ||
enable_lazy_filter |
no | Incremental filtering |
max_filter_by_candidates |
no | Similar words for fuzzy filter |
validate_field_names |
no | Validate filtered fields |
Ranking & Sorting Parameters
| Parameter | Description | Example |
|---|---|---|
sort_by |
Primary sorting control | publicationDate:desc,title:asc |
| Multiple fields with tie-breaking | ||
Special _text_match field |
||
| Conditional sorting | ||
query_by_weights |
Field importance weighting | title:2,description:1,author:1 |
text_match_type |
Text match scoring | max_score (default) |
prioritize_exact_match |
Exact match priority | true |
prioritize_token_position |
Word position priority | false |
prioritize_num_matching_fields |
Multiple field match priority | true |
Pagination Parameters
| Parameter | Description | Default |
|---|---|---|
page |
Page number | 1 |
per_page |
Results per page (max 250) | 10 |
offset |
Starting point | 0 |
limit |
Maximum hits | No limit |
Faceting Parameters
| Parameter | Description | Example |
|---|---|---|
facet_by |
Fields to facet on | category,brand,price_range |
facet_strategy |
Facet calculation method | exhaustive |
max_facet_values |
Max facet values returned | 10 |
facet_query |
Filter facet values | facet_query=category:shoe |
facet_query_num_typos |
Facet query fuzziness | 2 |
facet_return_parent |
Return parent objects | color.name |
facet_sample_percent |
Sampling percentage | 100 |
facet_sample_threshold |
Min hits for sampling | 0 |
Grouping Parameters
| Parameter | Description | Example |
|---|---|---|
group_by |
Field to group by | category,company_name |
group_limit |
Max hits per group | 3 |
group_missing_values |
Include null values in groups | true |
Results Parameters
| Parameter | Description | Example |
|---|---|---|
include_fields |
Fields to include | title,author,price |
exclude_fields |
Fields to exclude | search_time_ms,out_of |
highlight_fields |
Fields to highlight | title,description |
highlight_full_fields |
Full field highlighting | title,description |
highlight_affix_num_tokens |
Tokens around highlight | 4 |
highlight_start_tag |
Highlight start tag | <mark> |
highlight_end_tag |
Highlight end tag | </mark> |
snippet_threshold |
Full field highlight length | 30 |
limit_hits |
Maximum hits | 200 |
search_cutoff_ms |
Search timeout | No cutoff |
exhaustive_search |
Consider all variations | false |
use_cache |
Enable server caching | false |
cache_ttl |
Cache duration in seconds | 60 |
Curation Parameters
| Parameter | Description |
|---|---|
pinned_hits |
Promote specific hits |
hidden_hits |
Hide specific hits |
enable_overrides |
Enable curation rules |
override_tags |
Trigger specific rules |
Sample Request
curl -H "X-TYPESENSE-API-KEY: xyz" \
"https://typesense.example.com/collections/books/documents/search?q=javascript&query_by=title,description&sort_by=publicationDate:desc&facet_by=category,author&per_page=20"
Sample Response
{
"hits": [
{
"document": {
"id": "421",
"title": "JavaScript: The Good Parts",
"authors": ["Douglas Crockford"],
"publicationDate": 1640995200,
"categories": ["Programming", "Web Development"],
"prices": {
"USD": {"amount": 29.99, "discount": 5.00},
"GBP": {"amount": 24.99, "discount": 4.00}
},
"image": "https://example.com/covers/js-good-parts.jpg"
},
"highlights": {
"title": [
{"value": "<mark>JavaScript</mark>", "matched_tokens": ["javascript"]}
]
}
}
],
"facet_counts": [
{
"field_name": "categories",
"counts": [
{"value": "Programming", "count": 156},
{"value": "Web Development", "count": 89},
{"value": "Fiction", "count": 234}
]
}
],
"found": 1250,
"out_of": 5000,
"page": 1,
"request_params": {
"per_page": 20,
"q": "javascript"
},
"search_cutoff_ms": true,
"search_time_ms": 12
}
2. Documents Endpoint
Endpoint: POST /collections/{collection}/documents
Indexing Single Document
curl -X POST \
-H "X-TYPESENSE-API-KEY: xyz" \
-H "Content-Type: application/json" \
-d '{"id": "123", "title": "New Book", "author": "Author Name"}' \
"https://typesense.example.com/collections/books/documents"
Indexing Multiple Documents
curl -X POST \
-H "X-TYPESENSE-API-KEY: xyz" \
-H "Content-Type: application/jsonl" \
--data-binary @books.jsonl \
"https://typesense.example.com/collections/books/documents/import"
Retrieving Single Document
Endpoint: GET /collections/{collection}/documents/{id}
curl -H "X-TYPESENSE-API-KEY: xyz" \
"https://typesense.example.com/collections/books/documents/123"
Updating Document
Endpoint: PATCH /collections/{collection}/documents/{id}
curl -X PATCH \
-H "X-TYPESENSE-API-KEY: xyz" \
-H "Content-Type: application/json" \
-d '{"price": 19.99}' \
"https://typesense.example.com/collections/books/documents/123"
Deleting Document
Endpoint: DELETE /collections/{collection}/documents/{id}
curl -X DELETE \
-H "X-TYPESENSE-API-KEY: xyz" \
"https://typesense.example.com/collections/books/documents/123"
3. Collections Endpoint
Endpoint: POST /collections
Create Collection
curl -X POST \
-H "X-TYPESENSE-API-KEY: xyz" \
-H "Content-Type: application/json" \
-d '{
"name": "books",
"fields": [
{"name": "title", "type": "string", "facet": true},
{"name": "author", "type": "string", "facet": false},
{"name": "publicationDate", "type": "int64", "facet": false},
{"name": "price", "type": "float", "facet": true},
{"name": "categories", "type": "string[]", "facet": true, "optional": false}
],
"default_sorting_field": "publicationDate",
"token_separators": " "
}' \
"https://typesense.example.com/collections"
Retrieve Collection Schema
Endpoint: GET /collections/{collection}
curl -H "X-TYPESENSE-API-KEY: xyz" \
"https://typesense.example.com/collections/books"
Delete Collection
Endpoint: DELETE /collections/{collection}
curl -X DELETE \
-H "X-TYPESENSE-API-KEY: xyz" \
"https://typesense.example.com/collections/books"
4. Vector Search Endpoint
Endpoint: POST /collections/{collection}/documents/search
Vector Query
curl -X POST \
-H "X-TYPESENSE-API-KEY: xyz" \
-H "Content-Type: application/json" \
-d '{
"q": "*",
"vector_query": {
"vector": [0.1, 0.2, 0.3, 0.4, 0.5],
"k": 10
},
"query_by": "title"
}' \
"https://typesense.example.com/collections/books/documents/search"
5. Geo Search Endpoint
Endpoint: GET /collections/{collection}/documents/search
Location-based Search
curl -H "X-TYPESENSE-API-KEY: xyz" \
"https://typesense.example.com/collections/books/documents/search?q=*&filter_by=location:(48.853,2.344,5.1)&sort_by=location_field_name(48.853,2.344,5.1):asc"
Geo-filtered Search
curl -H "X-TYPESENSE-API-KEY: xyz" \
"https://typesense.example.com/collections/books/documents/search?q=coffee&filter_by=location:(48.853,2.344,5.1,10km)"
6. API Keys Endpoint
Generate Scoped Search Key
Endpoint: POST /keys
curl -X POST \
-H "X-TYPESENSE-API-KEY: master_key" \
-H "Content-Type: application/json" \
-d '{
"description": "Public search key for website",
"actions": ["documents:search"],
"collections": ["books"],
"expires_at": 1735689599
}' \
"https://typesense.example.com/keys"
List API Keys
Endpoint: GET /keys
curl -H "X-TYPESENSE-API-KEY: master_key" \
"https://typesense.example.com/keys"
Delete API Key
Endpoint: DELETE /keys/{id}
curl -X DELETE \
-H "X-TYPESENSE-API-KEY: master_key" \
"https://typesense.example.com/keys/123"
7. Cluster Operations
Create Snapshot
Endpoint: POST /operations/snapshot
curl -X POST \
-H "X-TYPESENSE-API-KEY: xyz" \
"https://typesense.example.com/operations/snapshot"
Compact Database
Endpoint: POST /operations/db/compact
curl -X POST \
-H "X-TYPESENSE-API-KEY: xyz" \
"https://typesense.example.com/operations/db/compact"
Clear Cache
Endpoint: POST /operations/cache/clear
curl -X POST \
-H "X-TYPESENSE-API-KEY: xyz" \
"https://typesense.example.com/operations/cache/clear"
Data Schema for Book Collections
Core Fields
{
"id": "string (unique identifier)",
"title": "string (full title)",
"subtitle": "string (subtitle/edition)",
"description": "string (full description)",
"summary": "string (brief summary)",
"authors": ["string array (author names)"],
"publicationDate": "timestamp (Unix epoch)",
"saleDate": "timestamp (Unix epoch)",
"publisher": "string (publisher name)",
"imprint": "string (imprint name)",
"isbn13": "string (ISBN-13)",
"isbn10": "string (ISBN-10)",
"pages": "integer (page count)",
"language": "string (language code)",
"categories": ["string array (subject categories)"],
"collections": ["string array (series collections)"],
"formats": [
{
"format": {"name": "string", "format_id": "number"},
"isbn": "string"
}
],
"prices": {
"USD": {"amount": "number", "discount": "number"},
"GBP": {"amount": "number", "discount": "number"},
"CAD": {"amount": "number", "discount": "number"},
"EUR": {"amount": "number", "discount": "number"}
},
"image": "url (cover image URL)",
"assets": [
{
"asset": {
"type": "string",
"sub_type": "string",
"path": "url",
"width": "number",
"height": "number"
}
}
],
"trim": {
"width": "number",
"height": "number",
"depth": "number",
"unit": "string"
},
"weight": {
"weight": "number",
"weight_unit": "string"
},
"edition": "string",
"awards": [
{
"award": {"name": "string", "id": "number"}
}
],
"reviews": [
{
"review": {"description": "string"}
}
],
"retailers": [
{
"label": "string",
"path": "string",
"seo": "string"
}
]
}
Faceted Fields Configuration
{
"fields": [
{
"name": "categories",
"type": "string[]",
"facet": true,
"optional": false
},
{
"name": "author",
"type": "string",
"facet": true
},
{
"name": "publicationDate",
"type": "int64",
"facet": false
},
{
"name": "price",
"type": "float",
"facet": true,
"optional": false
}
]
}
Advanced Features
Typo Tolerance
- Damerau-Levenshtein distance for calculating edit distance
- Configurable tolerance levels (0, 1, 2 typos)
- Prefix/Infix search for autocomplete scenarios
- Split join tokens for space-as-typo handling
Faceting Capabilities
- Exhaustive vs Top Values strategies for performance
- Numerical range faceting with custom labels
- Nested object faceting for complex data structures
- Facet query filtering for drill-down scenarios
Sorting Options
- Multi-field sorting with tie-breaking
- Text match score sorting by relevance
- Conditional expressions for dynamic sorting
- Decay functions for time-based relevance
- Random sorting with seed control
Caching & Performance
- Query result caching with TTL control
- RAM-based indexing for instant search
- Connection pooling for high throughput
- Lazy filtering for large datasets
Error Handling
Common Error Responses
{
"message": "No such collection found.",
"code": 404
}
{
"message": "Bad request.",
"code": 400
}
Error Codes Reference
| Code | Description | Solution |
|---|---|---|
| 400 | Bad Request | Check JSON syntax, required parameters |
| 401 | Unauthorized | Verify API key in headers |
| 404 | Not Found | Check collection/document existence |
| 409 | Conflict | Document ID already exists |
| 422 | Unprocessable | Validate field types/values |
| 429 | Too Many Requests | Implement rate limiting |
| 500 | Internal Error | Contact TypeSense support |
Performance Optimization
Indexing Strategy
- RAM allocation: Plan for 2x dataset size
- Field selection: Search only relevant fields
- Schema optimization: Enable sorting on frequently filtered fields
- Tokenizer configuration: Custom separators for content
Query Optimization
- Prefix queries: Use
prefix=truefor autocomplete - Field weighting: Prioritize important fields
- Filter early: Apply
filter_bybefore full text search - Limit results: Use
per_pageappropriately
Caching Strategy
- Server-side: Enable
use_cache=truefor repeated queries - Client-side: Implement application-level caching
- TTL management: Set appropriate
cache_ttlvalues
Integration Examples
Basic Search Implementation
const client = new TypesenseClient({
nodes: [{
host: 'typesense.example.com',
port: '443',
protocol: 'https'
}],
apiKey: 'xyz',
connectionTimeoutSeconds: 2
});
const searchResults = await client.collections('books')
.documents()
.search({
q: 'javascript programming',
query_by: 'title,description',
facet_by: 'categories,author',
sort_by: 'publicationDate:desc',
per_page: 20
});
Faceted Search with Filters
const results = await client.collections('books')
.documents()
.search({
q: '*',
filter_by: 'categories:[Programming,Web Development] && price:[20..50]',
facet_by: 'categories,author,publicationYear',
max_facet_values: 15,
sort_by: 'price:asc,title:asc'
});
Auto-complete Implementation
const suggestions = await client.collections('books')
.documents()
.search({
q: userQuery,
query_by: 'title,author',
prefix: true,
per_page: 8,
highlight_fields: 'title',
highlight_affix_num_tokens: 2
});
Generated: 2026-01-24
TypeSense Version: v29.0
Supapress Plugin: v2.26.2