Nitro API

Composables

Last updated by Harlan Wilton in chore: sync.

These composables are auto-imported in Nitro server context (API routes, middleware, plugins).

queryPages

Type: (event?: H3Event, options?: QueryPagesOptions) => Promise<PageEntry[] | PageData[]>

Unified page query function with filtering, pagination, and optional markdown content.

server/api/pages.get.ts
import { queryPages } from '#ai-ready'

export default defineEventHandler(async (event) => {
  // Get all pages
  const pages = await queryPages(event)
  return pages
})

Single page lookup:

server/api/page.get.ts
export default defineEventHandler(async (event) => {
  const { path } = getQuery(event)
  const page = await queryPages(event, { route: path as string, includeMarkdown: true })
  return page
})

QueryPagesOptions:

OptionTypeDescription
routestringGet single page by route
includeMarkdownbooleanInclude markdown content
where.pendingbooleanFilter by indexing status
where.hasErrorbooleanFilter by error status
where.source'prerender' | 'runtime'Filter by source
limitnumberMax pages to return
offsetnumberSkip first N pages

PageEntry:

PropertyTypeDescription
routestringPage route (e.g., /about)
titlestringPage title
descriptionstringMeta description
headingsstringPipe-separated headings (e.g., h1:Title|h2:Subtitle)
keywordsstring[]Extracted keywords
updatedAtstringISO timestamp

PageData: Extends PageEntry with markdown: string.

searchPages

Type: (event: H3Event, query: string, options?: SearchPagesOptions) => Promise<SearchResult[]>

Full-text search using SQLite FTS5. Searches title, description, route, headings, keywords, and markdown content.

server/api/search.get.ts
import { searchPages } from '#ai-ready'

export default defineEventHandler(async (event) => {
  const { q } = getQuery(event)
  return searchPages(event, q as string, { limit: 10 })
})

SearchResult:

PropertyTypeDescription
routestringPage route
titlestringPage title
descriptionstringMeta description
scorenumberBM25 relevance score

countPages

Type: (event?: H3Event, options?: CountPagesOptions) => Promise<number>

Count pages matching criteria.

server/api/stats.get.ts
import { countPages } from '#ai-ready'

export default defineEventHandler(async (event) => {
  const total = await countPages(event)
  const pending = await countPages(event, { where: { pending: true } })
  return { total, pending, indexed: total - pending }
})

streamPages

Type: (event?: H3Event, options?: StreamPagesOptions) => AsyncGenerator<PageData>

Stream pages using cursor-based pagination. Useful for large datasets.

server/api/export.get.ts
import { streamPages } from '#ai-ready'

export default defineEventHandler(async (event) => {
  const pages = []
  for await (const page of streamPages(event, { batchSize: 50 })) {
    pages.push({ route: page.route, title: page.title })
  }
  return pages
})

indexPage

Type: (route: string, html: string, options?: IndexPageOptions) => Promise<IndexPageResult>

Manually index a page into the database.

server/api/reindex.post.ts
import { indexPage } from '#ai-ready'

export default defineEventHandler(async (event) => {
  const { path } = await readBody(event)
  const html = await $fetch(path)
  return indexPage(path, html, { force: true })
})

Options:

OptionTypeDefaultDescription
ttlnumberconfig valueOverride TTL check
forcebooleanfalseRe-index even if fresh
skipHookbooleanfalseSkip ai-ready:page:indexed hook

Result:

PropertyTypeDescription
successbooleanWhether indexing succeeded
skippedbooleantrue if page was fresh
isUpdatebooleantrue if updating existing entry
contentChangedbooleantrue if content hash differs
dataobjectPage data if successful
errorstringError message if failed

indexPageByRoute

Type: (route: string, event?: H3Event, options?: IndexPageOptions) => Promise<IndexPageResult>

Fetch HTML and index in one call.

server/plugins/warm-cache.ts
import { indexPageByRoute } from '#ai-ready'

export default defineNitroPlugin(async () => {
  // Pre-warm important pages on startup
  const routes = ['/', '/docs', '/pricing']
  await Promise.all(routes.map(r => indexPageByRoute(r)))
})

useDatabase

Type: (event?: H3Event) => Promise<DatabaseAdapter>

Direct database access for advanced queries.

server/api/custom.get.ts
import { useDatabase } from '#ai-ready'

export default defineEventHandler(async (event) => {
  const db = await useDatabase(event)
  const rows = await db.all('SELECT route, title FROM ai_ready_pages WHERE indexed = 1')
  return rows
})

Data Sources

ContextSource
DevelopmentEmpty (warning logged)
PrerenderSQLite via virtual module
RuntimeSQLite via db0
Did this page help you?