Cursor-paginated browse over the catalog. Quality-first: by default excludes needs_review=true (use quality='all' for full pool).
USE WHEN: full catalog sync, delta sync (updated_since), exhaustive enumeration by filter. NOT WHEN: you only need N random samples (use quizbase_random) or a single record (use quizbase_question_by_id).
PAGINATION: stable cursor over id UUIDv7 DESC. First call: omit cursor. Next: pass meta.nextCursor. Stop when nextCursor is null.
KEY FILTERS (full parity with REST):
- lang: ISO 639-1, default "en". Supported: en, pl.
- category (slug), difficulty (trivial|easy|medium|hard|expert — LLM-calibrated), type (multiple|boolean), subcategory (raw slug).
- tags (AND), tags_any (OR, max 10): raw tag slugs.
- topic (curated, alias resolver), topics_any (OR over curated): higher precision than tags.
- regions (cultural affinity, AND): empty = no cultural advantage assumed. Lowercase ISO 3166-1 alpha-2 ('us', 'pl', 'gb') + cultural codes ('jewish', 'christian-catholic', 'islam'). Filter for content statistically more likely known by residents/members. Discover via quizbase_regions.
- source: one of 12 (opentdb, opentriviaqa, kqa-pro, entityq, mintaka, mkqa, nq-open, creak, qasc, arc, webq, quizbase).
- license (SPDX): e.g. CC-BY-SA-4.0, MIT.
- quality: 'high' (default) excludes needs_review=true; 'all' for full approved pool. When 'all', each question gains a "quality" field with value 'high' or 'needs_review'.
- updated_since (ISO 8601): only questions updated after this — for delta sync caches.
PAGINATION + COUNTING:
- cursor (string): from previous meta.nextCursor. Omit for page 1.
- limit (1-100, default 20).
- count: estimate (default, EXPLAIN-based ~5-20ms, ±5-50%) | none (skip).
OUTPUT: { questions: [...], meta: { count, countMode, language, nextCursor, totalEstimate? } }. Each question carries full per-record attribution (source, author, license, licenseVersion, licenseUrl, sourceId, url, modifications, lastModified) — identical shape to REST /api/v1/questions.
ATTRIBUTION REQUIRED if you redistribute. Credit each question using its own attribution object — see license + licenseUrl + modifications fields per record.
COMMON MISTAKES: not passing the cursor on subsequent calls (you'll re-read page 1); polling without updated_since when doing delta sync.