Three ways to find a document.

Pick one per request, or let hybrid do both at once.

A hybrid document search combining invoice and date filters with the meaning of telecom expenses, returning three ranked matches

Structured

Exact filters over extracted fields — vendor, document number, type, currency, issue date, total.

Semantic

Natural-language similarity over document summaries. Finds the right document when you don't know its number.

Hybrid

Keyword and semantic results fused together. The best default for a free-text question.

# Hybrid search: keywords + meaning (best default for free text)
curl -X POST https://api.gemina.co/api/v1/retrieval/query \
  -H "X-API-Key: your-api-key" \
  -H "Content-Type: application/json" \
  -d '{
    "mode": "hybrid",
    "text": "the credit note about the server outage",
    "topK": 10,
    "filters": { "issueDateFrom": "2026-01-01" }
  }'

Exact totals, computed in the database.

Sums, averages, and counts — never estimated by a model. The same numbers you would get by querying your own warehouse.

# Exact totals per vendor, computed in the database (never estimated by AI)
curl -X POST https://api.gemina.co/api/v1/retrieval/aggregate \
  -H "X-API-Key: your-api-key" \
  -H "Content-Type: application/json" \
  -d '{
    "metrics": [{ "op": "sum", "field": "total_amount" }, { "op": "count" }],
    "groupBy": ["vendor_name", "currency"],
    "filters": { "issueDateFrom": "2026-01-01", "issueDateTo": "2026-03-31" }
  }'

Currencies are never mixed

Ask for a money total without naming a currency and the server adds currency to the grouping rather than returning one meaningless number.

ResponseMETA
"meta": {
  "currencyGroupingAdded": true
}

It tells you it did it, so the number is never quietly wrong.

Re-uploads are collapsed

The same invoice indexed twice is counted once. Duplicates are matched on vendor tax ID, document number and issue date.

ResponseMETA
"meta": {
  "duplicatesIgnored": 3
}

Above zero means the same document was uploaded more than once.

Undercounts are declared

Quantities in different units are never summed together, and line items with no unit data are reported rather than silently skipped.

ResponseMETA
"meta": {
  "uomGroupingAdded": true,
  "linesWithoutUnitData": 12
}

You always know when a total would mislead you.

Your fields, discovered for you.

You never have to hard-code a schema into your search UI. Ask the API which fields your own documents actually carry, and build the filter list from the answer.

Add a new document type and its fields become filterable without a deploy on your side.

The Gemina console showing a natural-language search with field filters and ranked document results

What totals can and can't do.

Search works across everything you extract. Numeric roll-ups are narrower, and it's worth knowing where the line is.

Searchable and filterable

Anything you extract.

Invoices, forms, contracts, custom templates, FileTag metadata. Any field in your extracted data can be filtered and searched.

Summable today

Money and quantity.

Totals, net and tax amounts, and measurable quantities — grouped by vendor, currency, type, month, and more.

Not summable yet

Custom-template numbers.

Numbers in your own templates are searchable and filterable, but not yet available as aggregate metrics.

Search your own documents.

Start free. Indexing is opt-in, and search is never metered.