Turn any list into fast, accurate autocomplete
Publish an immutable version of your list once and AutoSugges serves it from the edge — so a keystroke never waits on a database, and your list stays yours.
Every suggestion shows what you typed
The characters you enter stay in full ink; the rest is what AutoSugges supplied. This is a real query against the platform’s countries list, answered from the Cloudflare edge — the same component you would mount, on the same runtime your own lists are served from.
Wire this into your own list on an integration guide.
Try any list
Every platform dataset is free to query on every plan, including Free (see pricing). Pick one: each is a live query against the Cloudflare edge, with the exact code that runs it.
Loading the live demo…
Example result: Africa > Western Africa > Burkina Faso
Code for this list
import { createAutosuggesClient } from '@autosugges/client';
import { Autocomplete } from '@autosugges/client/react';
// List: world-regions
// Example query: burkina
const autosugges = createAutosuggesClient({
baseUrl: 'https://runtime.autosugges.com',
publishableKey: 'YOUR_PUBLISHABLE_KEY',
});
void autosugges.bootstrap().catch(() => {});
export function WorldRegionsSearch() {
return (
<Autocomplete
source={autosugges}
label="Search World regions"
placeholder="Start typing…"
/>
);
}Cities
A live hierarchy query against the platform's own Cities list — pick a city and its state and country fill themselves in.
Code for this demo
import { createAutosuggesClient } from '@autosugges/client';
import { Autocomplete } from '@autosugges/client/react';
// List: cities
const autosugges = createAutosuggesClient({
baseUrl: 'https://runtime.autosugges.com',
publishableKey: 'YOUR_PUBLISHABLE_KEY',
});
void autosugges.bootstrap().catch(() => {});
export function CitiesForm() {
return (
<>
<Autocomplete
source={autosugges}
label="City"
placeholder="Start typing a city"
fillAncestors={{ 1: 'country', 2: 'state' }}
/>
<label>
State
<input name="state" />
</label>
<label>
Country
<input name="country" />
</label>
</>
);
}From your list to an edge lookup
Three steps. The published version is what answers every query — never a live query against your data.
1. Author a list
Add items with hierarchy, aliases, locales and metadata — through the dashboard or a CSV/JSON import.
2. Publish an immutable version
A version activates only after it verifies. Once published, it never changes — no client ever sees data mixed from two versions.
3. Serve it from the edge
Every query is answered from the edge, close to your users, from the version you published.
Built so your data stays yours
Tenant isolation and secret handling are not a feature you enable — they are built in.
Isolated by tenant
Every tenant's data is isolated from every other tenant's.
Credentials kept apart
Signing keys and billing records are stored separately from your list data.
Your database is never in the path
Autocomplete is served from your published version, never from your database.
Origin-restricted keys
Publishable keys can be restricted to your own origins, and usage limits are enforced on our side, never trusting the client.
A few lines, not an integration project
The same @autosugges/client package the docs teach is what you ship — debounce, cancellation and ARIA wiring included.
import { useState } from 'react';
import { createAutosuggesClient } from '@autosugges/client';
import { Autocomplete } from '@autosugges/client/react';
// One client per app, created outside the component so it survives re-renders.
const autosugges = createAutosuggesClient({
baseUrl: 'YOUR_RUNTIME_BASE_URL',
publishableKey: 'YOUR_PUBLISHABLE_KEY',
});
// Reads the list's real minChars/debounce. Fire-and-forget: the
// component works on documented fallbacks until this resolves, and the SDK has
// already logged any failure once at its own boundary.
void autosugges.bootstrap().catch(() => {});
export function CityField() {
const [city, setCity] = useState('');
const [region, setRegion] = useState('');
const [errorCode, setErrorCode] = useState<string | undefined>();
return (
<>
<Autocomplete
source={autosugges}
label="City"
placeholder="Start typing a city"
onSelect={(item, { ancestors }) => {
// item.value is what you store; item.displayValue is what was shown.
// ancestors is the precomputed hierarchy chain, root first — use it to
// auto-fill state/country fields without a second request.
setCity(item.value);
setRegion(ancestors.map((ancestor) => ancestor.displayValue).join(', '));
}}
onError={(error) => {
// error is an AutosuggesError. Switch on error.code — the codes and
// their remediation are listed below. Never invent a message string.
setErrorCode(error.code);
}}
/>
<input type="hidden" name="city" value={city} />
<input type="hidden" name="region" value={region} />
{errorCode !== undefined && <p role="alert">Lookup unavailable ({errorCode}).</p>}
</>
);
}React, Next.js, Expo and vanilla JS guides all carry the same Copy for AI / LLM control next to the code.
AutoSugges in numbers
Figures you can check against the docs and the platform's published limits.
- Default result limit
- 10 suggestions
- A list owner can set another default.
- Default minimum query length
- 2 characters
- Configurable per list, never 1.
- Default debounce
- 150 ms
- Delivered with the list settings and raisable per list.
- Free reference datasets
- 24
- Never priced on their own; every plan includes them.
- Measured round-trip latency, p50 / p95
- 72 ms / 92 ms
- Measured on 2026-09-23 from a single client; includes the network round trip.
As of .
Priced on queries, not on features
Every plan gets the same platform: aliases, hierarchy, localization and the SDK. What scales with your plan is how many queries you get and how many domains you can map — the Free tier gets everything except a custom subdomain or domain.
Start free
No card required to try it — publish a list and query it today.