openapi: 3.1.0
jsonSchemaDialect: https://json-schema.org/draft/2020-12/schema
info:
  title: German-Persian Dictionary API
  version: 1.7.0
  license:
    name: CC BY-SA 4.0
    url: https://creativecommons.org/licenses/by-sa/4.0/
  description: Read-only German-Persian dictionary contract. All response examples use synthetic, hand-authored
    fixture data. Successful responses identify the dataset version. Errors use one JSON envelope.
    The contract defines nine GET routes, including eight data routes and one health route.
    The compiled data use CC BY-SA 4.0. Credit the sources listed at /api/v1/sources,
    retain their attribution text and licence notices, link to the licence, and indicate changes.
    Share adaptations under the same licence. Each sentence record carries its own licence.
servers:
- url: /
  description: Same-origin dictionary service.
paths:
  /health:
    get:
      operationId: getHealth
      summary: Read dataset health
      description: Report active dataset metadata. Return 503 if the database file is missing, unreadable,
        or incompatible. The public site does not serve this route.
      parameters:
      - $ref: '#/components/parameters/Validator'
      responses:
        '200':
          description: The requested dictionary data.
          headers:
            ETag:
              $ref: '#/components/headers/ETag'
            Cache-Control:
              $ref: '#/components/headers/HealthCacheControl'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HealthResponse'
              examples:
                available:
                  $ref: '#/components/examples/HealthAvailable'
        '304':
          $ref: '#/components/responses/HealthNotModified'
        '503':
          $ref: '#/components/responses/DatasetUnavailable'
  /api/v1/search:
    get:
      operationId: searchDictionary
      summary: Search headwords and forms
      description: >-
        Search stored identities and select the scope under SearchResponse. Preserve whole-query counts,
        exact case, attested noun relations and every eligible correction choice independently of pagination.
        Prefix and substring remain candidates. Exact, form and permitted Latin matches precede them.
        Frequency rank, headword length, canonical text and language break ordinary ties.
        Eligible corrections precede skeleton and other fuzzy suggestions. Suggest is unchanged.
      parameters:
      - $ref: '#/components/parameters/Query'
      - $ref: '#/components/parameters/AutoLanguage'
      - $ref: '#/components/parameters/Limit'
      - $ref: '#/components/parameters/Offset'
      - $ref: '#/components/parameters/Validator'
      - $ref: '#/components/parameters/Correction'
      responses:
        '200':
          description: The requested dictionary data.
          headers:
            ETag:
              $ref: '#/components/headers/ETag'
            Cache-Control:
              $ref: '#/components/headers/DatasetCacheControl'
            Link:
              $ref: '#/components/headers/Link'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SearchResponse'
              examples:
                ExactAnswer:
                  $ref: '#/components/examples/SearchExactAnswer'
                MoreTranslations:
                  $ref: '#/components/examples/SearchMoreTranslations'
                PrefixAnswer:
                  $ref: '#/components/examples/SearchPrefixAnswer'
                OtherPos:
                  $ref: '#/components/examples/SearchOtherPos'
                germanForm:
                  $ref: '#/components/examples/SearchGermanForm'
                persianNormalization:
                  $ref: '#/components/examples/SearchPersianNormalization'
                noMatch:
                  $ref: '#/components/examples/SearchNoMatch'
                fuzzyMatch:
                  $ref: '#/components/examples/SearchFuzzyMatch'
                latinMatch:
                  $ref: '#/components/examples/SearchLatinMatch'
                latinSkeletonMatch:
                  $ref: '#/components/examples/SearchLatinSkeletonMatch'
                persianUsageLabels:
                  $ref: '#/components/examples/SearchPersianUsageLabels'
        '304':
          $ref: '#/components/responses/NotModified'
        '422':
          $ref: '#/components/responses/ValidationError'
        '503':
          $ref: '#/components/responses/DatasetUnavailable'
  /api/v1/sentences:
    get:
      operationId: searchSentences
      summary: Search example sentences
      description: Search folded example sentence text through the sentence_fts trigram index. Use fold_de(q)
        against de_fold and de_fold_alt for German, and fold_fa(q) against fa_fold for Persian. Auto selects
        the language from script; ambiguous queries search both languages. Require at least three characters
        after folding, otherwise return 422 with the standard error schema. Return each matching sentence
        pair once. Order alignment direct first, then higher quality first with null last, then shorter
        sentences first, then id in binary order. Sentence length uses the selected language text; ambiguous
        queries use the sum of both text lengths. The final id is the sentence hash exposed in the response.
        Total counts matches before limit and offset. The interpreted query uses the search response schema.
        If the dataset was built without the sentence index, return 503 with error code
        dataset_unavailable.
      parameters:
      - $ref: '#/components/parameters/Query'
      - $ref: '#/components/parameters/AutoLanguage'
      - $ref: '#/components/parameters/Limit'
      - $ref: '#/components/parameters/Offset'
      - $ref: '#/components/parameters/Validator'
      responses:
        '200':
          description: The requested dictionary data.
          headers:
            ETag:
              $ref: '#/components/headers/ETag'
            Cache-Control:
              $ref: '#/components/headers/DatasetCacheControl'
            Link:
              $ref: '#/components/headers/Link'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SentencesResponse'
              examples:
                german:
                  $ref: '#/components/examples/SentencesGerman'
        '304':
          $ref: '#/components/responses/NotModified'
        '422':
          $ref: '#/components/responses/ValidationError'
        '503':
          $ref: '#/components/responses/DatasetUnavailable'
  /api/v1/suggest:
    get:
      operationId: suggestHeadwords
      summary: Complete a headword prefix
      description: Return canonical headwords whose search text starts with the normalized query. Order
        by frequency rank, headword length, canonical text, and language. Return all known parts of speech
        for each headword. This endpoint uses prefix matches only. For Latin-letter queries without
        Arabic-script letters, lang=auto lists German prefixes first. Fill free rows with Persian
        headwords whose exact Latin key starts with the plain reading, in the same rank and length order.
        With lang=fa, return Persian rows only. With lang=de, return German rows only.
        Loose keys, alternate readings, forms and skeletons do not supply Latin prefix suggestions.
      parameters:
      - $ref: '#/components/parameters/Query'
      - $ref: '#/components/parameters/AutoLanguage'
      - name: limit
        in: query
        required: false
        description: Maximum number of prefix suggestions.
        schema:
          type: integer
          minimum: 1
          maximum: 50
          default: 10
      - $ref: '#/components/parameters/Validator'
      responses:
        '200':
          description: The requested dictionary data.
          headers:
            ETag:
              $ref: '#/components/headers/ETag'
            Cache-Control:
              $ref: '#/components/headers/DatasetCacheControl'
            Link:
              $ref: '#/components/headers/Link'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SuggestResponse'
              examples:
                prefix:
                  $ref: '#/components/examples/SuggestPrefix'
        '304':
          $ref: '#/components/responses/NotModified'
        '422':
          $ref: '#/components/responses/ValidationError'
        '503':
          $ref: '#/components/responses/DatasetUnavailable'
  /api/v1/entry/{lang}/{headword}:
    get:
      operationId: getEntry
      summary: Read a complete dictionary entry
      description: 'Normalize the path headword and return all its parts of speech. Each part of speech
        has language-specific grammar, lemma usage labels, and all translations. Use database rank order:
        rank_de for a German entry and rank_fa for a Persian entry. Ranks use score descending, source_count
        descending, target text, then target lemma key. Each translation exposes one source key and reference
        per evidence row, in evidence order. Page through every same-language lemma with is_multiword
        = 1 whose normalized text contains the entry headword as one whitespace-separated word exactly.
        Exclude the entry itself. Order by freq_rank with null last, then headword text. Related totals
        count all matches before related_limit and related_offset. Each related entry includes the first
        five translations in database rank order. Sentence pairs retain their source_key, source_ref,
        licence, and attribution. Order sentences by quality, highest first, with null last and sentence
        id as the final tie breaker.'
      parameters:
      - name: lang
        in: path
        required: true
        description: Language of the requested canonical headword.
        schema:
          $ref: '#/components/schemas/Lang'
      - name: headword
        in: path
        required: true
        description: URL-encoded canonical headword.
        schema:
          type: string
          minLength: 1
          maxLength: 200
      - $ref: '#/components/parameters/RelatedLimit'
      - $ref: '#/components/parameters/RelatedOffset'
      - $ref: '#/components/parameters/SentencesLimit'
      - $ref: '#/components/parameters/SentencesOffset'
      - $ref: '#/components/parameters/Validator'
      responses:
        '200':
          description: The requested dictionary data.
          headers:
            ETag:
              $ref: '#/components/headers/ETag'
            Cache-Control:
              $ref: '#/components/headers/DatasetCacheControl'
            Link:
              $ref: '#/components/headers/Link'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EntryResponse'
              examples:
                german:
                  $ref: '#/components/examples/EntryGerman'
                persian:
                  $ref: '#/components/examples/EntryPersian'
                relatedProverb:
                  $ref: '#/components/examples/EntryRelatedProverb'
                germanUsageLabels:
                  $ref: '#/components/examples/EntryGermanUsageLabels'
                attestedGrammar:
                  $ref: '#/components/examples/EntryGermanAttestedGrammar'
        '304':
          $ref: '#/components/responses/NotModified'
        '422':
          $ref: '#/components/responses/ValidationError'
        '404':
          $ref: '#/components/responses/NotFound'
        '503':
          $ref: '#/components/responses/DatasetUnavailable'
  /api/v1/headwords:
    get:
      operationId: listHeadwords
      summary: List canonical headwords
      description: Use keyset pagination over unique canonical headwords in Unicode code point order.
        Pass next_after as after for the next page. After is an exclusive canonical headword cursor in
        the selected language. Use the same dataset version for every page; restart after a version change.
      parameters:
      - $ref: '#/components/parameters/Language'
      - name: after
        in: query
        required: false
        description: Exclusive canonical headword cursor from the previous response.
        schema:
          $ref: '#/components/schemas/NonEmptyString'
      - name: limit
        in: query
        required: false
        description: Maximum number of distinct headwords.
        schema:
          type: integer
          minimum: 1
          maximum: 1000
          default: 100
      - $ref: '#/components/parameters/Validator'
      responses:
        '200':
          description: The requested dictionary data.
          headers:
            ETag:
              $ref: '#/components/headers/ETag'
            Cache-Control:
              $ref: '#/components/headers/DatasetCacheControl'
            Link:
              $ref: '#/components/headers/Link'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HeadwordsResponse'
              examples:
                firstPage:
                  $ref: '#/components/examples/HeadwordsFirstPage'
        '304':
          $ref: '#/components/responses/NotModified'
        '422':
          $ref: '#/components/responses/ValidationError'
        '503':
          $ref: '#/components/responses/DatasetUnavailable'
  /api/v1/forms/{lang}:
    get:
      operationId: getFormIndex
      summary: Read the complete form index of one language
      description: Return canonical headwords, frequency ranks, and stored forms for local lookup.
        Headwords use binary order. Forms map to sorted unique zero-based headword indexes.
        This route accepts no text to resolve.
      parameters:
      - name: lang
        in: path
        required: true
        description: Language of the form index.
        schema:
          $ref: '#/components/schemas/Lang'
      - $ref: '#/components/parameters/Validator'
      responses:
        '200':
          description: The requested form index.
          headers:
            ETag:
              $ref: '#/components/headers/ETag'
            Cache-Control:
              $ref: '#/components/headers/DatasetCacheControl'
            Link:
              $ref: '#/components/headers/Link'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FormIndexResponse'
              examples:
                german:
                  $ref: '#/components/examples/FormIndexGerman'
        '304':
          $ref: '#/components/responses/NotModified'
        '422':
          $ref: '#/components/responses/ValidationError'
        '503':
          $ref: '#/components/responses/DatasetUnavailable'
  /api/v1/sources:
    get:
      operationId: listSources
      summary: Read source and licence metadata
      description: Return source manifests with attribution, licence terms, snapshots, file hashes, and
        record counts. Sentence attribution must remain available alongside sentence text.
      parameters:
      - $ref: '#/components/parameters/Validator'
      responses:
        '200':
          description: The requested dictionary data.
          headers:
            ETag:
              $ref: '#/components/headers/ETag'
            Cache-Control:
              $ref: '#/components/headers/DatasetCacheControl'
            Link:
              $ref: '#/components/headers/Link'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SourcesResponse'
              examples:
                syntheticSources:
                  $ref: '#/components/examples/SourcesSyntheticSources'
        '304':
          $ref: '#/components/responses/NotModified'
        '422':
          $ref: '#/components/responses/ValidationError'
        '503':
          $ref: '#/components/responses/DatasetUnavailable'
  /api/v1/stats:
    get:
      operationId: getStats
      summary: Read dataset counts
      description: Return lemma counts by language, translation counts by link type, and sentence counts
        by alignment. Counts describe merged records in the active dataset.
      parameters:
      - $ref: '#/components/parameters/Validator'
      responses:
        '200':
          description: The requested dictionary data.
          headers:
            ETag:
              $ref: '#/components/headers/ETag'
            Cache-Control:
              $ref: '#/components/headers/DatasetCacheControl'
            Link:
              $ref: '#/components/headers/Link'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StatsResponse'
              examples:
                syntheticCounts:
                  $ref: '#/components/examples/StatsSyntheticCounts'
        '304':
          $ref: '#/components/responses/NotModified'
        '422':
          $ref: '#/components/responses/ValidationError'
        '503':
          $ref: '#/components/responses/DatasetUnavailable'
components:
  parameters:
    Correction:
      name: correction
      in: query
      required: false
      description: Use off for original search without a corrected answer or preview. Full and partial lookup
        still apply. Omission means on.
      schema:
        type: string
        enum:
        - 'on'
        - 'off'
        default: 'on'
    Query:
      name: q
      in: query
      required: true
      description: Nonblank query, at most 200 Unicode characters before normalization.
      schema:
        type: string
        minLength: 1
        maxLength: 200
        pattern: \S
    AutoLanguage:
      name: lang
      in: query
      required: false
      description: Auto selects language from script. Ambiguous queries search both languages.
        Search and suggest also use Persian Latin readings for queries with a Latin letter and no
        Arabic-script letter, with auto or fa. Auto keeps German exact hits first and restricts
        Latin matches to the plain exact reading when a German exact or form hit exists.
        Under this guard, German forms and permitted Latin hits share ascending freq_rank order,
        with missing ranks last and German forms first on ties. Each group retains its existing order.
        Auto suggestions keep German
        prefixes first. Explicit de excludes Persian hits; explicit fa excludes German hits and removes
        the German-hit guard. Sentence search retains script-based keys without Latin readings.
      schema:
        type: string
        enum:
        - auto
        - de
        - fa
        default: auto
    Language:
      name: lang
      in: query
      required: true
      description: Language of the headword list.
      schema:
        $ref: '#/components/schemas/Lang'
    Limit:
      name: limit
      in: query
      required: false
      description: Maximum number of search results.
      schema:
        type: integer
        minimum: 1
        maximum: 100
        default: 20
    Offset:
      name: offset
      in: query
      required: false
      description: Number of ranked results to skip.
      schema:
        type: integer
        minimum: 0
        default: 0
    Validator:
      name: If-None-Match
      in: header
      required: false
      description: Return 304 when this validator matches the current representation.
      schema:
        type: string
    SentencesLimit:
      name: sentences_limit
      in: query
      required: false
      description: Maximum number of sentence pairs.
      schema:
        type: integer
        minimum: 1
        maximum: 100
        default: 10
    SentencesOffset:
      name: sentences_offset
      in: query
      required: false
      description: Number of ranked sentence pairs to skip.
      schema:
        type: integer
        minimum: 0
        default: 0
    RelatedLimit:
      name: related_limit
      in: query
      required: false
      description: Maximum number of related entries.
      schema:
        type: integer
        minimum: 1
        maximum: 100
        default: 20
    RelatedOffset:
      name: related_offset
      in: query
      required: false
      description: Number of ranked related entries to skip.
      schema:
        type: integer
        minimum: 0
        default: 0
  responses:
    NotModified:
      description: The client validator matches the current dataset representation.
      headers:
        ETag:
          $ref: '#/components/headers/ETag'
        Cache-Control:
          $ref: '#/components/headers/DatasetCacheControl'
        Link:
          $ref: '#/components/headers/Link'
    ValidationError:
      description: A query or path parameter fails validation.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            error:
              $ref: '#/components/examples/ValidationError'
      headers:
        Cache-Control:
          $ref: '#/components/headers/ErrorCacheControl'
    NotFound:
      description: No canonical headword exists for the selected language.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            error:
              $ref: '#/components/examples/NotFound'
      headers:
        Cache-Control:
          $ref: '#/components/headers/ErrorCacheControl'
    DatasetUnavailable:
      description: The database file is missing, unreadable, or incompatible.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            error:
              $ref: '#/components/examples/DatasetUnavailable'
      headers:
        Cache-Control:
          $ref: '#/components/headers/ErrorCacheControl'
    HealthNotModified:
      description: The client validator matches current health metadata.
      headers:
        ETag:
          $ref: '#/components/headers/ETag'
        Cache-Control:
          $ref: '#/components/headers/HealthCacheControl'
  schemas:
    NonEmptyString:
      type: string
      minLength: 1
    NullableString:
      type:
      - string
      - 'null'
      minLength: 1
    StringList:
      type: array
      items:
        $ref: '#/components/schemas/NonEmptyString'
    Lang:
      type: string
      enum:
      - de
      - fa
    NullableLang:
      type:
      - string
      - 'null'
      enum:
      - de
      - fa
      - null
    Pos:
      type:
      - string
      - 'null'
      enum:
      - noun
      - proper_noun
      - verb
      - adjective
      - adverb
      - pronoun
      - determiner
      - preposition
      - conjunction
      - interjection
      - numeral
      - particle
      - affix
      - abbreviation
      - phrase
      - idiom
      - proverb
      - other
      - null
    Gender:
      type: string
      enum:
      - m
      - f
      - n
    LinkType:
      type: string
      enum:
      - direct
      - pivot_sense
      - pivot_gloss
      - mined
    Alignment:
      type: string
      enum:
      - direct
      - pivot
      - mined
    Count:
      type: integer
      minimum: 0
    Score:
      type: number
      minimum: 0
      maximum: 1
    SenseList:
      type: array
      items:
        $ref: '#/components/schemas/Sense'
    SourceKey:
      type: string
      pattern: ^[a-z0-9_]+$
    LemmaKey:
      type: string
      pattern: ^(de|fa):[0-9a-f]{64}$
    Digest:
      type: string
      pattern: ^[0-9a-f]{64}$
    Sense:
      type: object
      additionalProperties: false
      properties:
        en:
          $ref: '#/components/schemas/NullableString'
        de:
          $ref: '#/components/schemas/NullableString'
        fa:
          $ref: '#/components/schemas/NullableString'
      required: []
    Form:
      type: object
      additionalProperties: false
      properties:
        form:
          $ref: '#/components/schemas/NonEmptyString'
        tags:
          $ref: '#/components/schemas/StringList'
      required:
      - form
      - tags
    GrammarScope:
      additionalProperties: false
      description: One source entry or sense, independent of any translation sense.
      if:
        properties:
          kind:
            const: entry
      properties:
        source:
          pattern: ^[a-z0-9_]+$
          title: Source
          type: string
        source_ref:
          description: When the source has a web page for the record, `source_ref` is the absolute https URL
            of that page, for example https://de.wiktionary.org/wiki/Haus. Otherwise it is a locator string
            that a person can follow.
          minLength: 1
          title: Source Ref
          type: string
        kind:
          enum:
          - entry
          - sense
          title: Kind
          type: string
        locator:
          minLength: 1
          title: Locator
          type: string
        sense_id:
          anyOf:
          - minLength: 1
            type: string
          - type: 'null'
          default: null
          title: Sense Id
      required:
      - source
      - source_ref
      - kind
      - locator
      then:
        properties:
          sense_id:
            type: 'null'
      title: GrammarScope
      type: object
    GrammarEvidence:
      additionalProperties: false
      description: Exact source annotation and locator within the fact's source scope.
      properties:
        pattern:
          enum:
          - tagged_form
          - de_verb
          - de_conj
          - sense_tag
          - sense_annotation
          - plus_obj
          title: Pattern
          type: string
        locator:
          minLength: 1
          title: Locator
          type: string
        annotation:
          minLength: 1
          title: Annotation
          type: string
        tags:
          items:
            minLength: 1
            type: string
          title: Tags
          type: array
        pronouns:
          items:
            minLength: 1
            type: string
          title: Pronouns
          type: array
        qualifiers:
          items:
            minLength: 1
            type: string
          title: Qualifiers
          type: array
      required:
      - pattern
      - locator
      - annotation
      title: GrammarEvidence
      type: object
    InfinitiveFact:
      additionalProperties: false
      allOf:
      - allOf:
        - properties:
            evidence:
              items:
                if:
                  properties:
                    pattern:
                      const: tagged_form
                properties:
                  pattern:
                    enum:
                    - tagged_form
                    - de_verb
                then:
                  properties:
                    tags:
                      contains:
                        const: infinitive
                  required:
                  - tags
      - properties:
          tags:
            contains:
              const: infinitive
            not:
              contains:
                enum:
                - perfect
                - future
                - extended
                - infinitive-zu
                - passive
                - nominative
                - accusative
                - dative
                - genitive
          evidence:
            items:
              if:
                properties:
                  pattern:
                    const: tagged_form
              then:
                properties:
                  tags:
                    contains:
                      const: infinitive
                    not:
                      contains:
                        enum:
                        - perfect
                        - future
                        - extended
                        - infinitive-zu
                        - passive
                        - nominative
                        - accusative
                        - dative
                        - genitive
                required:
                - tags
      properties:
        scope:
          $ref: '#/components/schemas/GrammarScope'
        evidence:
          items:
            $ref: '#/components/schemas/GrammarEvidence'
          minItems: 1
          title: Evidence
          type: array
        form:
          minLength: 1
          title: Form
          type: string
        tags:
          items:
            minLength: 1
            type: string
          minItems: 1
          title: Tags
          type: array
      required:
      - scope
      - evidence
      - form
      - tags
      title: InfinitiveFact
      type: object
    PrincipalPartFact:
      additionalProperties: false
      allOf:
      - allOf:
        - properties:
            evidence:
              items:
                properties:
                  pattern:
                    enum:
                    - tagged_form
                    - de_verb
      - if:
          properties:
            role:
              const: present
        then:
          properties:
            tags:
              allOf:
              - contains:
                  enum:
                  - present
              - not:
                  contains:
                    enum:
                    - nominative
                    - accusative
                    - dative
                    - genitive
                    - participle
                    - participle-2
                    - infinitive
                    - perfect
                    - pluperfect
                    - future
                    - passive
            evidence:
              items:
                if:
                  properties:
                    pattern:
                      const: tagged_form
                then:
                  properties:
                    tags:
                      allOf:
                      - contains:
                          enum:
                          - present
                      - not:
                          contains:
                            enum:
                            - nominative
                            - accusative
                            - dative
                            - genitive
                            - participle
                            - participle-2
                            - infinitive
                            - perfect
                            - pluperfect
                            - future
                            - passive
                  required:
                  - tags
      - if:
          properties:
            role:
              const: past
        then:
          properties:
            tags:
              allOf:
              - contains:
                  enum:
                  - past
                  - preterite
              - not:
                  contains:
                    enum:
                    - nominative
                    - accusative
                    - dative
                    - genitive
                    - participle
                    - participle-2
                    - infinitive
                    - perfect
                    - pluperfect
                    - future
                    - passive
            evidence:
              items:
                if:
                  properties:
                    pattern:
                      const: tagged_form
                then:
                  properties:
                    tags:
                      allOf:
                      - contains:
                          enum:
                          - past
                          - preterite
                      - not:
                          contains:
                            enum:
                            - nominative
                            - accusative
                            - dative
                            - genitive
                            - participle
                            - participle-2
                            - infinitive
                            - perfect
                            - pluperfect
                            - future
                            - passive
                  required:
                  - tags
      - if:
          properties:
            role:
              const: participle
        then:
          properties:
            tags:
              allOf:
              - not:
                  contains:
                    enum:
                    - nominative
                    - accusative
                    - dative
                    - genitive
              - anyOf:
                - contains:
                    const: participle-2
                - allOf:
                  - contains:
                      const: participle
                  - contains:
                      enum:
                      - past
                      - preterite
                      - perfect
            evidence:
              items:
                if:
                  properties:
                    pattern:
                      const: tagged_form
                then:
                  properties:
                    tags:
                      allOf:
                      - not:
                          contains:
                            enum:
                            - nominative
                            - accusative
                            - dative
                            - genitive
                      - anyOf:
                        - contains:
                            const: participle-2
                        - allOf:
                          - contains:
                              const: participle
                          - contains:
                              enum:
                              - past
                              - preterite
                              - perfect
                  required:
                  - tags
      properties:
        scope:
          $ref: '#/components/schemas/GrammarScope'
        evidence:
          items:
            $ref: '#/components/schemas/GrammarEvidence'
          minItems: 1
          title: Evidence
          type: array
        form:
          minLength: 1
          title: Form
          type: string
        role:
          enum:
          - present
          - past
          - participle
          title: Role
          type: string
        tags:
          items:
            minLength: 1
            type: string
          minItems: 1
          title: Tags
          type: array
      required:
      - scope
      - evidence
      - form
      - role
      - tags
      title: PrincipalPartFact
      type: object
    AuxiliaryFact:
      additionalProperties: false
      allOf:
      - allOf:
        - properties:
            evidence:
              items:
                if:
                  properties:
                    pattern:
                      const: tagged_form
                properties:
                  pattern:
                    enum:
                    - tagged_form
                    - de_verb
                then:
                  properties:
                    tags:
                      contains:
                        const: auxiliary
                  required:
                  - tags
      - if:
          properties:
            value:
              const: haben
        then:
          properties:
            evidence:
              items:
                if:
                  properties:
                    pattern:
                      const: tagged_form
                then:
                  properties:
                    annotation:
                      enum:
                      - haben
                      - haben or sein
                      - sein or haben
      - if:
          properties:
            value:
              const: sein
        then:
          properties:
            evidence:
              items:
                if:
                  properties:
                    pattern:
                      const: tagged_form
                then:
                  properties:
                    annotation:
                      enum:
                      - sein
                      - haben or sein
                      - sein or haben
      properties:
        scope:
          $ref: '#/components/schemas/GrammarScope'
        evidence:
          items:
            $ref: '#/components/schemas/GrammarEvidence'
          minItems: 1
          title: Evidence
          type: array
        value:
          enum:
          - haben
          - sein
          title: Value
          type: string
      required:
      - scope
      - evidence
      - value
      title: AuxiliaryFact
      type: object
    ReflexiveFact:
      additionalProperties: false
      allOf:
      - allOf:
        - properties:
            evidence:
              items:
                properties:
                  pattern:
                    enum:
                    - sense_tag
      - properties:
          evidence:
            items:
              properties:
                tags:
                  not:
                    allOf:
                    - contains:
                        enum:
                        - reflexive
                        - statal-reflexive
                    - contains:
                        const: non-reflexive
      - if:
          properties:
            value:
              const: true
        then:
          properties:
            evidence:
              items:
                properties:
                  tags:
                    contains:
                      enum:
                      - reflexive
                      - statal-reflexive
                required:
                - tags
      - if:
          properties:
            value:
              const: false
        then:
          properties:
            evidence:
              items:
                properties:
                  tags:
                    contains:
                      enum:
                      - non-reflexive
                required:
                - tags
      properties:
        scope:
          $ref: '#/components/schemas/GrammarScope'
        evidence:
          items:
            $ref: '#/components/schemas/GrammarEvidence'
          minItems: 1
          title: Evidence
          type: array
        value:
          title: Value
          type: boolean
      required:
      - scope
      - evidence
      - value
      title: ReflexiveFact
      type: object
    SeparabilityFact:
      additionalProperties: false
      allOf:
      - allOf:
        - properties:
            evidence:
              items:
                properties:
                  pattern:
                    enum:
                    - sense_tag
                    - de_conj
      - properties:
          evidence:
            items:
              properties:
                tags:
                  not:
                    allOf:
                    - contains:
                        enum:
                        - separable
                    - contains:
                        const: inseparable
      - if:
          properties:
            value:
              const: true
        then:
          properties:
            evidence:
              items:
                else:
                  properties:
                    annotation:
                      pattern: ^[a-zäöüß]+(?:\.[a-zäöüß]+)+(?:<[^<>]+>)?$
                if:
                  properties:
                    pattern:
                      const: sense_tag
                then:
                  properties:
                    tags:
                      contains:
                        enum:
                        - separable
                  required:
                  - tags
      - if:
          properties:
            value:
              const: false
        then:
          properties:
            evidence:
              items:
                properties:
                  tags:
                    contains:
                      enum:
                      - inseparable
                  pattern:
                    const: sense_tag
                required:
                - tags
      properties:
        scope:
          $ref: '#/components/schemas/GrammarScope'
        evidence:
          items:
            $ref: '#/components/schemas/GrammarEvidence'
          minItems: 1
          title: Evidence
          type: array
        value:
          title: Value
          type: boolean
      required:
      - scope
      - evidence
      - value
      title: SeparabilityFact
      type: object
    GrammaticalCase:
      enum:
      - accusative
      - dative
      - genitive
      title: GrammaticalCase
      type: string
    PrepositionComponent:
      additionalProperties: false
      allOf:
      - if:
          properties:
            case:
              const: accusative
          required:
          - case
        then:
          properties:
            case_annotation:
              pattern: ^:[a-zäöüß]+\(acc\)(?:<[^<>]+>)*$
              type: string
          required:
          - case_annotation
      - if:
          properties:
            case:
              const: dative
          required:
          - case
        then:
          properties:
            case_annotation:
              pattern: ^:[a-zäöüß]+\(dat\)(?:<[^<>]+>)*$
              type: string
          required:
          - case_annotation
      - if:
          properties:
            case:
              const: genitive
          required:
          - case
        then:
          properties:
            case_annotation:
              pattern: ^:[a-zäöüß]+\(gen\)(?:<[^<>]+>)*$
              type: string
          required:
          - case_annotation
      properties:
        kind:
          const: preposition
          title: Kind
          type: string
        preposition:
          pattern: ^[a-zäöüß]+$
          title: Preposition
          type: string
        case:
          anyOf:
          - $ref: '#/components/schemas/GrammaticalCase'
          - type: 'null'
          default: null
        case_annotation:
          anyOf:
          - minLength: 1
            type: string
          - type: 'null'
          default: null
          title: Case Annotation
        gloss:
          anyOf:
          - minLength: 1
            type: string
          - type: 'null'
          default: null
          title: Gloss
        optional:
          anyOf:
          - type: boolean
          - type: 'null'
          default: null
          title: Optional
        qualifiers:
          items:
            minLength: 1
            type: string
          title: Qualifiers
          type: array
      required:
      - kind
      - preposition
      title: PrepositionComponent
      type: object
    ObjectComponent:
      additionalProperties: false
      allOf:
      - if:
          properties:
            case:
              const: accusative
          required:
          - case
        then:
          properties:
            case_annotation:
              pattern: ^acc(?:<[^<>]+>)*$
              type: string
          required:
          - case_annotation
      - if:
          properties:
            case:
              const: dative
          required:
          - case
        then:
          properties:
            case_annotation:
              pattern: ^dat(?:<[^<>]+>)*$
              type: string
          required:
          - case_annotation
      - if:
          properties:
            case:
              const: genitive
          required:
          - case
        then:
          properties:
            case_annotation:
              pattern: ^gen(?:<[^<>]+>)*$
              type: string
          required:
          - case_annotation
      properties:
        kind:
          const: object
          title: Kind
          type: string
        case:
          $ref: '#/components/schemas/GrammaticalCase'
        case_annotation:
          minLength: 1
          title: Case Annotation
          type: string
        gloss:
          anyOf:
          - minLength: 1
            type: string
          - type: 'null'
          default: null
          title: Gloss
        optional:
          anyOf:
          - type: boolean
          - type: 'null'
          default: null
          title: Optional
        qualifiers:
          items:
            minLength: 1
            type: string
          title: Qualifiers
          type: array
      required:
      - kind
      - case
      - case_annotation
      title: ObjectComponent
      type: object
    ConstructionFact:
      additionalProperties: false
      allOf:
      - properties:
          scope:
            properties:
              kind:
                const: sense
      - if:
          properties:
            evidence:
              contains:
                properties:
                  pattern:
                    const: plus_obj
        then:
          properties:
            components:
              items:
                properties:
                  case:
                    type: string
                required:
                - case
      - allOf:
        - properties:
            evidence:
              items:
                properties:
                  pattern:
                    enum:
                    - plus_obj
                    - sense_annotation
      - if:
          properties:
            components:
              contains:
                properties:
                  case:
                    type: string
                required:
                - case
        then:
          allOf:
          - properties:
              evidence:
                items:
                  properties:
                    pattern:
                      enum:
                      - plus_obj
      properties:
        scope:
          $ref: '#/components/schemas/GrammarScope'
        evidence:
          items:
            $ref: '#/components/schemas/GrammarEvidence'
          minItems: 1
          title: Evidence
          type: array
        components:
          items:
            discriminator:
              mapping:
                object: '#/components/schemas/ObjectComponent'
                preposition: '#/components/schemas/PrepositionComponent'
              propertyName: kind
            oneOf:
            - $ref: '#/components/schemas/PrepositionComponent'
            - $ref: '#/components/schemas/ObjectComponent'
          minItems: 1
          title: Components
          type: array
      required:
      - scope
      - evidence
      - components
      title: ConstructionFact
      type: object
    GrammarAssociationEvidence:
      additionalProperties: false
      properties:
        source:
          pattern: ^[a-z0-9_]+$
          title: Source
          type: string
        source_ref:
          description: When the source has a web page for the record, `source_ref` is the absolute https URL
            of that page, for example https://de.wiktionary.org/wiki/Haus. Otherwise it is a locator string
            that a person can follow.
          minLength: 1
          title: Source Ref
          type: string
        locator:
          minLength: 1
          title: Locator
          type: string
        annotation:
          minLength: 1
          title: Annotation
          type: string
      required:
      - source
      - source_ref
      - locator
      - annotation
      title: GrammarAssociationEvidence
      type: object
    GrammarAssociation:
      additionalProperties: false
      allOf:
      - properties:
          source_scope:
            properties:
              kind:
                const: sense
          sense:
            anyOf:
            - properties:
                de:
                  type: string
              required:
              - de
            - properties:
                fa:
                  type: string
              required:
              - fa
            - properties:
                en:
                  type: string
              required:
              - en
      description: An explicit relation to a translation sense, never a gloss-based assumption.
      properties:
        source_scope:
          $ref: '#/components/schemas/GrammarScope'
        de_key:
          pattern: ^de:[0-9a-f]{64}$
          title: De Key
          type: string
        fa_key:
          pattern: ^fa:[0-9a-f]{64}$
          title: Fa Key
          type: string
        sense:
          $ref: '#/components/schemas/Sense'
        evidence:
          items:
            $ref: '#/components/schemas/GrammarAssociationEvidence'
          minItems: 1
          title: Evidence
          type: array
      required:
      - source_scope
      - de_key
      - fa_key
      - sense
      - evidence
      title: GrammarAssociation
      type: object
    GermanGrammar:
      description: Schema 4 preserves attested facts for the exact source or target lemma. Empty or absent fact lists mean unknown. Consumers omit absent facts without placeholder text. Source scope is separate from translation scope.
      type: object
      additionalProperties: false
      properties:
        infinitives:
          items:
            $ref: '#/components/schemas/InfinitiveFact'
          title: Infinitives
          type: array
        principal_parts:
          items:
            $ref: '#/components/schemas/PrincipalPartFact'
          title: Principal Parts
          type: array
        auxiliaries:
          items:
            $ref: '#/components/schemas/AuxiliaryFact'
          title: Auxiliaries
          type: array
        reflexivity:
          items:
            $ref: '#/components/schemas/ReflexiveFact'
          title: Reflexivity
          type: array
        separability:
          items:
            $ref: '#/components/schemas/SeparabilityFact'
          title: Separability
          type: array
        constructions:
          items:
            $ref: '#/components/schemas/ConstructionFact'
          title: Constructions
          type: array
        grammar_associations:
          items:
            $ref: '#/components/schemas/GrammarAssociation'
          title: Grammar Associations
          type: array
        genders:
          type: array
          items:
            $ref: '#/components/schemas/Gender'
          uniqueItems: true
        plurals:
          $ref: '#/components/schemas/StringList'
        genitives:
          $ref: '#/components/schemas/StringList'
        ipa:
          $ref: '#/components/schemas/StringList'
        forms:
          type: array
          items:
            $ref: '#/components/schemas/Form'
        freq_rank:
          type:
          - integer
          - 'null'
          minimum: 1
        articles:
          type: array
          items:
            type: string
            enum:
            - der
            - die
            - das
        number:
          type: string
          enum:
          - singular
          - plural_only
          - unknown
        plural_status:
          type: string
          enum:
          - known
          - none
          - unknown
      required:
      - genders
      - plurals
      - genitives
      - ipa
      - forms
      - freq_rank
      - articles
      - number
      - plural_status
    PersianGrammar:
      type: object
      additionalProperties: false
      properties:
        plurals:
          $ref: '#/components/schemas/StringList'
        ipa:
          $ref: '#/components/schemas/StringList'
        romanizations:
          $ref: '#/components/schemas/StringList'
        vocalizations:
          $ref: '#/components/schemas/StringList'
        forms:
          type: array
          items:
            $ref: '#/components/schemas/Form'
        freq_rank:
          type:
          - integer
          - 'null'
          minimum: 1
      required:
      - plurals
      - ipa
      - romanizations
      - vocalizations
      - forms
      - freq_rank
    Translation:
      type: object
      additionalProperties: false
      properties:
        lang:
          $ref: '#/components/schemas/Lang'
        text:
          $ref: '#/components/schemas/NonEmptyString'
        romanization:
          $ref: '#/components/schemas/NullableString'
          description: Romanization of the Persian lemma when it has exactly one distinct romanization, otherwise
            null.
        vocalization:
          $ref: '#/components/schemas/NullableString'
          description: Stored vocalization for this translation, otherwise the Persian lemma vocalization
            when it has exactly one, otherwise null.
        senses:
          $ref: '#/components/schemas/SenseList'
        labels:
          $ref: '#/components/schemas/StringList'
        link_type:
          $ref: '#/components/schemas/LinkType'
        score:
          $ref: '#/components/schemas/Score'
        target_headword:
          $ref: '#/components/schemas/NullableString'
        target_pos:
          $ref: '#/components/schemas/Pos'
        target_grammar:
          oneOf:
          - $ref: '#/components/schemas/GermanGrammar'
          - $ref: '#/components/schemas/PersianGrammar'
          - type: 'null'
        target_sources:
          type: array
          items:
            $ref: '#/components/schemas/TranslationSource'
        sources:
          type: array
          items:
            $ref: '#/components/schemas/TranslationSource'
          minItems: 1
          description: One object per stored evidence row, in evidence order. Repeated source keys retain
            separate references.
      required:
      - lang
      - text
      - romanization
      - vocalization
      - senses
      - labels
      - link_type
      - score
      - target_headword
      - target_pos
      - target_grammar
      - target_sources
      - sources
      description: 'Use database rank order: rank_de for a German entry and rank_fa for a Persian entry. Ranks
        use score descending, source_count descending, target text, then target lemma key. Search returns
        the first five translations in this order. Persian romanization appears as text only when the lemma
        has exactly one distinct romanization; otherwise it is null. Target grammar uses the linked target
        lemma id. Grammar source references are empty when the database lacks record locators.'
      allOf:
      - if:
          properties:
            lang:
              const: de
        then:
          properties:
            target_grammar:
              oneOf:
              - $ref: '#/components/schemas/GermanGrammar'
              - type: 'null'
      - if:
          properties:
            lang:
              const: fa
        then:
          properties:
            target_grammar:
              oneOf:
              - $ref: '#/components/schemas/PersianGrammar'
              - type: 'null'
      - if:
          properties:
            target_pos:
              not:
                const: noun
        then:
          properties:
            target_grammar:
              if:
                type: object
                required:
                - articles
              then:
                properties:
                  articles:
                    maxItems: 0
    EntryTranslation:
      type: object
      additionalProperties: false
      properties:
        lang:
          $ref: '#/components/schemas/Lang'
        text:
          $ref: '#/components/schemas/NonEmptyString'
        romanization:
          $ref: '#/components/schemas/NullableString'
          description: Romanization of the Persian lemma when it has exactly one distinct romanization, otherwise
            null.
        vocalization:
          $ref: '#/components/schemas/NullableString'
          description: Stored vocalization for this translation, otherwise the Persian lemma vocalization
            when it has exactly one, otherwise null.
        senses:
          $ref: '#/components/schemas/SenseList'
        labels:
          $ref: '#/components/schemas/StringList'
        link_type:
          $ref: '#/components/schemas/LinkType'
        score:
          $ref: '#/components/schemas/Score'
        sources:
          type: array
          items:
            $ref: '#/components/schemas/TranslationSource'
          minItems: 1
          description: One object per stored evidence row, in evidence order. Repeated source keys retain
            separate references.
        target_headword:
          $ref: '#/components/schemas/NullableString'
        target_pos:
          $ref: '#/components/schemas/Pos'
        target_grammar:
          oneOf:
          - $ref: '#/components/schemas/GermanGrammar'
          - $ref: '#/components/schemas/PersianGrammar'
          - type: 'null'
        target_sources:
          type: array
          items:
            $ref: '#/components/schemas/TranslationSource'
      required:
      - lang
      - text
      - romanization
      - vocalization
      - senses
      - labels
      - link_type
      - score
      - sources
      - target_headword
      - target_pos
      - target_grammar
      - target_sources
      description: 'Use database rank order: rank_de for a German entry and rank_fa for a Persian entry. Ranks
        use score descending, source_count descending, target text, then target lemma key. Sources expose
        the source key and stored source_ref for each evidence row, in evidence order. Target grammar uses
        the linked target lemma id. Grammar source references are empty when the database lacks record locators.'
      allOf:
      - if:
          properties:
            lang:
              const: de
        then:
          properties:
            target_grammar:
              oneOf:
              - $ref: '#/components/schemas/GermanGrammar'
              - type: 'null'
      - if:
          properties:
            lang:
              const: fa
        then:
          properties:
            target_grammar:
              oneOf:
              - $ref: '#/components/schemas/PersianGrammar'
              - type: 'null'
      - if:
          properties:
            target_pos:
              not:
                const: noun
        then:
          properties:
            target_grammar:
              if:
                type: object
                required:
                - articles
              then:
                properties:
                  articles:
                    maxItems: 0
    GermanSearchPos:
      type: object
      additionalProperties: false
      properties:
        pos:
          $ref: '#/components/schemas/Pos'
        labels:
          $ref: '#/components/schemas/StringList'
          description: Usage labels of this lemma, separate from translation labels.
        grammar:
          $ref: '#/components/schemas/GermanGrammar'
        translations:
          type: array
          items:
            $ref: '#/components/schemas/Translation'
          maxItems: 5
      required:
      - pos
      - labels
      - grammar
      - translations
    GermanEntryPos:
      type: object
      additionalProperties: false
      properties:
        pos:
          $ref: '#/components/schemas/Pos'
        labels:
          $ref: '#/components/schemas/StringList'
          description: Usage labels of this lemma, separate from translation labels.
        grammar:
          $ref: '#/components/schemas/GermanGrammar'
        translations:
          type: array
          items:
            $ref: '#/components/schemas/EntryTranslation'
      required:
      - pos
      - labels
      - grammar
      - translations
    PersianSearchPos:
      type: object
      additionalProperties: false
      properties:
        pos:
          $ref: '#/components/schemas/Pos'
        labels:
          $ref: '#/components/schemas/StringList'
          description: Usage labels of this lemma, separate from translation labels.
        grammar:
          $ref: '#/components/schemas/PersianGrammar'
        translations:
          type: array
          items:
            $ref: '#/components/schemas/Translation'
          maxItems: 5
      required:
      - pos
      - labels
      - grammar
      - translations
    PersianEntryPos:
      type: object
      additionalProperties: false
      properties:
        pos:
          $ref: '#/components/schemas/Pos'
        labels:
          $ref: '#/components/schemas/StringList'
          description: Usage labels of this lemma, separate from translation labels.
        grammar:
          $ref: '#/components/schemas/PersianGrammar'
        translations:
          type: array
          items:
            $ref: '#/components/schemas/EntryTranslation'
      required:
      - pos
      - labels
      - grammar
      - translations
    MatchedReading:
      type: object
      additionalProperties: false
      properties:
        form:
          $ref: '#/components/schemas/NonEmptyString'
        kind:
          type: string
          enum: [form, plural, genitive]
        tags:
          $ref: '#/components/schemas/StringList'
      required: [form, kind, tags]
      description: One stored form relation. Tags assert no auxiliary, reflexivity or governed case beyond the stored record.
    LookupSpan:
      type: object
      additionalProperties: false
      properties:
        start:
          type: integer
          minimum: 0
          maximum: 199
        end:
          type: integer
          minimum: 1
          maximum: 200
        surface:
          $ref: '#/components/schemas/NonEmptyString'
      required: [start, end, surface]
      description: >-
        Half-open Unicode code-point offsets against interpreted_query.raw. Start is less than end.
        Surface equals the raw slice, without normalization. JavaScript converts each offset with
        Array.from(raw).slice(0, offset).join('').length before String.slice, or slices Array.from(raw) directly.
    SegmentKey:
      type: object
      additionalProperties: false
      properties:
        lang:
          $ref: '#/components/schemas/Lang'
        key:
          $ref: '#/components/schemas/NonEmptyString'
      required: [lang, key]
      description: Normalized lookup key, separate from the raw span and canonical identity.
    SegmentMatch:
      type: object
      additionalProperties: false
      properties:
        lang:
          $ref: '#/components/schemas/Lang'
        headword:
          $ref: '#/components/schemas/NonEmptyString'
        lemma_key:
          $ref: '#/components/schemas/NonEmptyString'
        pos:
          $ref: '#/components/schemas/Pos'
        match:
          $ref: '#/components/schemas/Match'
        source_keys:
          type: array
          items:
            $ref: '#/components/schemas/SourceKey'
          uniqueItems: true
        answer:
          oneOf:
          - $ref: '#/components/schemas/CompactAnswer'
          - type: 'null'
        related_spans:
          type: array
          items:
            $ref: '#/components/schemas/LookupSpan'
          maxItems: 2
      required:
      - lang
      - headword
      - lemma_key
      - pos
      - match
      - source_keys
      - answer
      - related_spans
      description: A canonical identity and part of speech with stored evidence. Answer belongs to this identity
        and part of speech; it is not a phrase translation. Source keys retain lemma evidence where record
        references are unavailable. Translation evidence retains ordinary source and target fields. Related
        spans associate a stored separated form with both positions, without including intervening text. Contract
        1.7 replaces the former full segment answer with CompactAnswer; canonical and main answers keep full
        fields.
      allOf:
      - if:
          properties:
            lang:
              const: de
        then:
          properties:
            answer:
              properties:
                translation:
                  properties:
                    lang:
                      const: fa
                more_translations:
                  items:
                    properties:
                      lang:
                        const: fa
                other_pos:
                  items:
                    properties:
                      translation:
                        properties:
                          lang:
                            const: fa
      - if:
          properties:
            lang:
              const: fa
        then:
          properties:
            answer:
              properties:
                translation:
                  properties:
                    lang:
                      const: de
                more_translations:
                  items:
                    properties:
                      lang:
                        const: de
                other_pos:
                  items:
                    properties:
                      translation:
                        properties:
                          lang:
                            const: de
    LookupSegment:
      type: object
      additionalProperties: false
      properties:
        start:
          type: integer
          minimum: 0
          maximum: 199
        end:
          type: integer
          minimum: 1
          maximum: 200
        surface:
          $ref: '#/components/schemas/NonEmptyString'
        kind:
          type: string
          enum: [word, phrase, compound, unresolved, plain]
        keys:
          type: array
          items:
            $ref: '#/components/schemas/SegmentKey'
        matches:
          type: array
          items:
            $ref: '#/components/schemas/SegmentMatch'
      required: [start, end, surface, kind, keys, matches]
      description: >-
        One raw span in input order, including repeats. Spans partition interpreted_query.raw exactly,
        with the LookupSpan coordinate convention. Plain spans retain punctuation, whitespace and compound
        linking elements, and are not unknown words. Unresolved spans have no matches.
    Match:
      type: object
      additionalProperties: false
      properties:
        type:
          type: string
          enum:
          - exact
          - form
          - latin
          - prefix
          - substring
          - latin_skeleton
          - fuzzy
        text:
          $ref: '#/components/schemas/NonEmptyString'
        readings:
          type: array
          items:
            $ref: '#/components/schemas/MatchedReading'
          minItems: 1
      required:
      - type
      - text
      allOf:
      - if:
          properties:
            type:
              const: form
        then:
          required: [readings]
      description: Readings retain all stored relations for the preferred surface, with exact spelling before folded collisions. Text is the matched canonical headword or stored form. Form matches return the canonical
        headword in the parent result. For latin, text is the first stored romanization with an eligible
        exact key, else the first with an eligible loose key, else the first vocalization whose complete
        reading has an eligible loose key, else the headword. Eligibility follows the language policy
        and German-hit guard. Search-only spellings never appear here. For latin_skeleton, text is the
        Persian headword. Latin is a full match; latin_skeleton supplies a candidate only.
        Under the auto German-hit guard, form and latin matches share frequency order without a change
        to their type or text. Exact headwords retain priority, missing ranks sort last, and forms win rank ties.
    GermanSearchResult:
      type: object
      additionalProperties: false
      properties:
        lang:
          type: string
          const: de
        headword:
          $ref: '#/components/schemas/NonEmptyString'
        match:
          $ref: '#/components/schemas/Match'
        pos_blocks:
          type: array
          items:
            $ref: '#/components/schemas/GermanSearchPos'
          minItems: 1
        best_translation:
          oneOf:
          - $ref: '#/components/schemas/BestTranslation'
          - type: 'null'
      required:
      - lang
      - headword
      - match
      - pos_blocks
      - best_translation
    PersianSearchResult:
      type: object
      additionalProperties: false
      properties:
        lang:
          type: string
          const: fa
        headword:
          $ref: '#/components/schemas/NonEmptyString'
        match:
          $ref: '#/components/schemas/Match'
        pos_blocks:
          type: array
          items:
            $ref: '#/components/schemas/PersianSearchPos'
          minItems: 1
        best_translation:
          oneOf:
          - $ref: '#/components/schemas/BestTranslation'
          - type: 'null'
      required:
      - lang
      - headword
      - match
      - pos_blocks
      - best_translation
    SearchResult:
      oneOf:
      - $ref: '#/components/schemas/GermanSearchResult'
      - $ref: '#/components/schemas/PersianSearchResult'
    InterpretedQuery:
      type: object
      additionalProperties: false
      properties:
        raw:
          type: string
          minLength: 1
          maxLength: 200
        detected_lang:
          $ref: '#/components/schemas/NullableLang'
        normalized:
          $ref: '#/components/schemas/NonEmptyString'
      required:
      - raw
      - detected_lang
      - normalized
      description: Detected language is null for ambiguous or mixed text. Normalized text follows the
        selected language rules.
    Suggestion:
      type: object
      additionalProperties: false
      properties:
        lang:
          $ref: '#/components/schemas/Lang'
        headword:
          $ref: '#/components/schemas/NonEmptyString'
        pos:
          type: array
          items:
            $ref: '#/components/schemas/Pos'
          minItems: 1
          uniqueItems: true
      required:
      - lang
      - headword
      - pos
    CompactTranslation:
      type: object
      additionalProperties: false
      properties:
        lang:
          $ref: '#/components/schemas/Lang'
        text:
          $ref: '#/components/schemas/NonEmptyString'
        score:
          $ref: '#/components/schemas/Score'
        sources:
          type: array
          items:
            type: object
            additionalProperties: false
            properties:
              key:
                $ref: '#/components/schemas/SourceKey'
            required:
            - key
          uniqueItems: true
        romanization:
          $ref: '#/components/schemas/NullableString'
          description: Romanization of the Persian lemma when it has exactly one distinct romanization, otherwise
            null.
        vocalization:
          $ref: '#/components/schemas/NullableString'
          description: Stored vocalization for this translation, otherwise the Persian lemma vocalization
            when it has exactly one, otherwise null.
        target_headword:
          $ref: '#/components/schemas/NullableString'
        target_pos:
          $ref: '#/components/schemas/Pos'
      required:
      - lang
      - text
      - score
      - sources
      - romanization
      - vocalization
      - target_headword
      - target_pos
      description: Compact stored translation. Score below 0.85 requires the localized unconfirmed note. Sources
        retain unique keys; full references and grammar stay on the main answer and entry.
    CompactOtherPos:
      type: object
      additionalProperties: false
      properties:
        source_pos:
          $ref: '#/components/schemas/Pos'
        translation:
          $ref: '#/components/schemas/CompactTranslation'
      required:
      - source_pos
      - translation
    CompactAnswer:
      type: object
      additionalProperties: false
      properties:
        translation:
          $ref: '#/components/schemas/CompactTranslation'
        more_translations:
          type: array
          items:
            $ref: '#/components/schemas/CompactTranslation'
          maxItems: 3
        other_pos:
          type: array
          items:
            $ref: '#/components/schemas/CompactOtherPos'
      required:
      - translation
      - more_translations
      - other_pos
      description: Translation choices for the identity, part of speech and match on the enclosing SegmentMatch.
        No duplicate identity, grammar or form lists.
      allOf:
      - properties:
          more_translations:
            items:
              properties:
                score:
                  minimum: 0.85
    PartialScope:
      type: object
      additionalProperties: false
      properties:
        segment_index:
          type: integer
          minimum: 0
          maximum: 199
        match_index:
          type: integer
          minimum: 0
        kind:
          type: string
          enum:
          - word
          - phrase
          - sentence
      required:
      - segment_index
      - match_index
      - kind
      description: Indexes select the primary compact unit from segments. All units and unresolved spans remain
        there in input order. Kind selects the scope wording, not a generated translation.
    CorrectionEvidence:
      type: object
      additionalProperties: false
      properties:
        raw:
          $ref: '#/components/schemas/NonEmptyString'
        complete:
          type: boolean
        distance:
          type: integer
          const: 1
        initial_preserved:
          type: boolean
          const: true
        candidates:
          type: array
          items:
            $ref: '#/components/schemas/SegmentMatch'
          minItems: 1
      required:
      - raw
      - complete
      - distance
      - initial_preserved
      - candidates
      description: Eligible choices in stable dictionary order, first as the preview. Complete is false if
        the 10000-row candidate bound is exhausted. Only complete evidence with one identity permits corrected
        state. Confidence uses distance and unchanged initial, never translation scores.
    SearchResponse:
      type: object
      additionalProperties: false
      properties:
        dataset_version:
          $ref: '#/components/schemas/NonEmptyString'
        interpreted_query:
          $ref: '#/components/schemas/InterpretedQuery'
        segments:
          type: array
          items:
            $ref: '#/components/schemas/LookupSegment'
          maxItems: 200
        segments_complete:
          type: boolean
          description: False if a declared component work bound was reached. Unresolved spans then assert
            no exhaustive absence.
        total:
          $ref: '#/components/schemas/Count'
        limit:
          type: integer
          minimum: 1
          maximum: 100
        offset:
          $ref: '#/components/schemas/Count'
        results:
          type: array
          items:
            $ref: '#/components/schemas/SearchResult'
        suggestions:
          type: array
          items:
            $ref: '#/components/schemas/Suggestion'
          maxItems: 5
        answer:
          oneOf:
          - $ref: '#/components/schemas/LookupAnswer'
          - type: 'null'
        state:
          type: string
          enum:
          - full
          - partial
          - corrected
          - ambiguous
          - missing
        partial:
          oneOf:
          - $ref: '#/components/schemas/PartialScope'
          - type: 'null'
        correction:
          oneOf:
          - $ref: '#/components/schemas/CorrectionEvidence'
          - type: 'null'
      required:
      - dataset_version
      - interpreted_query
      - total
      - limit
      - offset
      - results
      - suggestions
      - answer
      - segments
      - segments_complete
      - state
      - partial
      - correction
      description: Full stored headwords, phrases, forms and permitted Latin keys precede all fallback states.
        Stored spans and complete compound splits precede all correction states. Disabled correction retains
        the same full and partial matches.
        Partial selection uses longest stored contiguous span, then first content word,
        then function word. Answers, segments and correction choices stay independent of pagination. A distinct
        attested noun base takes answer priority over a competing standalone noun headword if a stored noun
        form has tags or a plural relation; exact stored surface wins among noun bases. Otherwise exact case
        takes precedence, including an untranslated identity. Supported translations break ties only within
        the same exact case class. Without exact matches, the first form or Latin result supplies the answer.
        A query with a Latin letter and no Arabic-script letter also searches Persian Latin keys with
        lang=auto or lang=fa; lang=de does not search them. The latin tier prefers exact keys to
        vowel-merged loose keys. With lang=auto, a German exact or form hit restricts this tier to the
        plain reading and exact keys. Each result block uses database rank order, rank_de for a German
        entry and rank_fa for a Persian entry. Ranks use score descending, source_count descending,
        target text, then target lemma key. Search returns the first five translations per block in this order.
        Legacy total counts whole-query exact, form, Latin, prefix and substring rows, excluding partial units
        and corrections. Results retain whole-query rows; eligible corrections precede unrelated skeleton
        candidates. Suggestions remain capped at five; correction.candidates retains all equally close eligible
        identities regardless of the page. Answer now also serves partial, corrected and ambiguous states;
        state and scope must accompany its presentation. Entry answers retain their prior meaning. Component
        limits remain 512 surfaces, eight phrase tokens plus the whole input, 100 separated pairs, 2048 compound
        substrings, 128 hits per key and 4096 hits per batch. Compound tokens have 8 to 40 letters, two or
        three known parts of at least four letters, and links empty, s, es, n, en, er or e. Incomplete splits
        remain unresolved. Correction considers a German alphabetic token of 4 to 40 normalized letters in
        auto or de mode, at distance one with the initial unchanged, and a stored translation. A token attested
        in German example sentences after normalization and case folding receives no correction state.
        The sentence word set is shared by requests for the same dataset snapshot. A unique eligible target
        requires a frequency rank of at most 20000 for the corrected state; a missing or higher rank yields
        ambiguous choices even when the complete scan finds only one identity. A capped scan
        never proves uniqueness. Corrected also requires complete component resolution (segments_complete=true);
        otherwise, eligible candidates yield ambiguous choices.
        Original search with correction=off retains suggestions and raw input, without
        a corrected answer or preview.
      allOf:
      - if:
          properties:
            state:
              const: full
        then:
          properties:
            partial:
              type: 'null'
            correction:
              type: 'null'
            answer:
              properties:
                match:
                  properties:
                    type:
                      enum:
                      - exact
                      - form
                      - latin
      - if:
          properties:
            state:
              const: partial
        then:
          properties:
            partial:
              $ref: '#/components/schemas/PartialScope'
            correction:
              type: 'null'
            answer:
              properties:
                match:
                  properties:
                    type:
                      enum:
                      - exact
                      - form
                      - latin
      - if:
          properties:
            state:
              const: corrected
        then:
          properties:
            segments_complete:
              const: true
            partial:
              type: 'null'
            correction:
              allOf:
              - $ref: '#/components/schemas/CorrectionEvidence'
              - properties:
                  complete:
                    const: true
                  candidates:
                    maxItems: 1
            answer:
              allOf:
              - $ref: '#/components/schemas/LookupAnswer'
              - properties:
                  match:
                    properties:
                      type:
                        const: fuzzy
      - if:
          properties:
            state:
              const: ambiguous
        then:
          properties:
            partial:
              type: 'null'
            correction:
              $ref: '#/components/schemas/CorrectionEvidence'
            answer:
              allOf:
              - $ref: '#/components/schemas/LookupAnswer'
              - properties:
                  match:
                    properties:
                      type:
                        const: fuzzy
      - if:
          properties:
            state:
              const: missing
        then:
          properties:
            partial:
              type: 'null'
            correction:
              type: 'null'
            answer:
              type: 'null'
    SuggestResponse:
      type: object
      additionalProperties: false
      properties:
        dataset_version:
          $ref: '#/components/schemas/NonEmptyString'
        interpreted_query:
          $ref: '#/components/schemas/InterpretedQuery'
        results:
          type: array
          items:
            $ref: '#/components/schemas/Suggestion'
          maxItems: 50
      required:
      - dataset_version
      - interpreted_query
      - results
    RelatedEntry:
      type: object
      additionalProperties: false
      properties:
        lang:
          $ref: '#/components/schemas/Lang'
        headword:
          $ref: '#/components/schemas/NonEmptyString'
        pos:
          $ref: '#/components/schemas/Pos'
        translations:
          type: array
          items:
            $ref: '#/components/schemas/Translation'
          description: The first five translations in database rank order. Use rank_de for a German related
            lemma and rank_fa for a Persian related lemma. Ranks use score descending, source_count descending,
            target text, then target lemma key.
          maxItems: 5
      required:
      - lang
      - headword
      - pos
      - translations
      description: Return every same-language lemma with is_multiword = 1 whose normalized text contains
        the entry headword as one whitespace-separated word exactly. Exclude the entry itself. Order by
        freq_rank with null last, then headword text.
    EntrySentence:
      type: object
      additionalProperties: false
      properties:
        id:
          $ref: '#/components/schemas/Digest'
        de:
          $ref: '#/components/schemas/NonEmptyString'
        fa:
          $ref: '#/components/schemas/NonEmptyString'
        alignment:
          $ref: '#/components/schemas/Alignment'
        source_key:
          $ref: '#/components/schemas/SourceKey'
        source_ref:
          $ref: '#/components/schemas/NonEmptyString'
          description: When the source has a web page for the record, `source_ref` is the absolute https
            URL of that page, for example https://de.wiktionary.org/wiki/Haus. Otherwise it is a locator
            string that a person can follow.
        licence:
          $ref: '#/components/schemas/NonEmptyString'
        attribution:
          $ref: '#/components/schemas/NonEmptyString'
        quality:
          type:
          - number
          - 'null'
          minimum: 0
          maximum: 1
        lemma_keys:
          type: array
          items:
            $ref: '#/components/schemas/LemmaKey'
          uniqueItems: true
      required:
      - id
      - de
      - fa
      - alignment
      - source_key
      - source_ref
      - licence
      - attribution
      - quality
      - lemma_keys
    GermanEntryResponse:
      type: object
      additionalProperties: false
      properties:
        dataset_version:
          $ref: '#/components/schemas/NonEmptyString'
        lang:
          type: string
          const: de
        headword:
          $ref: '#/components/schemas/NonEmptyString'
        pos_blocks:
          type: array
          items:
            $ref: '#/components/schemas/GermanEntryPos'
          minItems: 1
        related:
          type: array
          items:
            $ref: '#/components/schemas/RelatedEntry'
        sentences:
          type: array
          items:
            $ref: '#/components/schemas/EntrySentence'
        sentences_total:
          $ref: '#/components/schemas/Count'
        sentences_limit:
          type: integer
          minimum: 1
          maximum: 100
        sentences_offset:
          $ref: '#/components/schemas/Count'
        related_total:
          $ref: '#/components/schemas/Count'
        related_limit:
          type: integer
          minimum: 1
          maximum: 100
        related_offset:
          $ref: '#/components/schemas/Count'
        answer:
          oneOf:
          - $ref: '#/components/schemas/LookupAnswer'
          - type: 'null'
      required:
      - dataset_version
      - lang
      - headword
      - pos_blocks
      - related
      - sentences
      - sentences_total
      - sentences_limit
      - sentences_offset
      - related_total
      - related_limit
      - related_offset
      - answer
    PersianEntryResponse:
      type: object
      additionalProperties: false
      properties:
        dataset_version:
          $ref: '#/components/schemas/NonEmptyString'
        lang:
          type: string
          const: fa
        headword:
          $ref: '#/components/schemas/NonEmptyString'
        pos_blocks:
          type: array
          items:
            $ref: '#/components/schemas/PersianEntryPos'
          minItems: 1
        related:
          type: array
          items:
            $ref: '#/components/schemas/RelatedEntry'
        sentences:
          type: array
          items:
            $ref: '#/components/schemas/EntrySentence'
        sentences_total:
          $ref: '#/components/schemas/Count'
        sentences_limit:
          type: integer
          minimum: 1
          maximum: 100
        sentences_offset:
          $ref: '#/components/schemas/Count'
        related_total:
          $ref: '#/components/schemas/Count'
        related_limit:
          type: integer
          minimum: 1
          maximum: 100
        related_offset:
          $ref: '#/components/schemas/Count'
        answer:
          oneOf:
          - $ref: '#/components/schemas/LookupAnswer'
          - type: 'null'
      required:
      - dataset_version
      - lang
      - headword
      - pos_blocks
      - related
      - sentences
      - sentences_total
      - sentences_limit
      - sentences_offset
      - related_total
      - related_limit
      - related_offset
      - answer
    EntryResponse:
      oneOf:
      - $ref: '#/components/schemas/GermanEntryResponse'
      - $ref: '#/components/schemas/PersianEntryResponse'
    HeadwordsResponse:
      type: object
      additionalProperties: false
      properties:
        dataset_version:
          $ref: '#/components/schemas/NonEmptyString'
        lang:
          $ref: '#/components/schemas/Lang'
        headwords:
          $ref: '#/components/schemas/StringList'
        next_after:
          $ref: '#/components/schemas/NullableString'
      required:
      - dataset_version
      - lang
      - headwords
      - next_after
      description: Headwords are unique canonical text values. Next after is the last value when another
        page exists, otherwise null.
    FormIndexResponse:
      type: object
      additionalProperties: false
      required:
      - dataset_version
      - lang
      - headwords
      - ranks
      - forms
      properties:
        dataset_version:
          $ref: '#/components/schemas/NonEmptyString'
        lang:
          $ref: '#/components/schemas/Lang'
        headwords:
          type: array
          uniqueItems: true
          items:
            $ref: '#/components/schemas/NonEmptyString'
          description: All distinct canonical headwords of the language in binary order, with or without forms.
        ranks:
          type: array
          items:
            type: [integer, 'null']
            minimum: 1
          description: Lowest known frequency rank per headword, or null. Length and order match headwords.
        forms:
          type: object
          propertyNames:
            minLength: 1
          additionalProperties:
            type: array
            minItems: 1
            uniqueItems: true
            items:
              type: integer
              minimum: 0
          description: Each stored form maps to sorted unique zero-based indexes within headwords.
    SourceFile:
      type: object
      additionalProperties: false
      properties:
        url:
          type: string
          format: uri
        sha256:
          $ref: '#/components/schemas/Digest'
        bytes:
          $ref: '#/components/schemas/Count'
      required:
      - url
      - sha256
      - bytes
    SourceCounts:
      type: object
      additionalProperties: false
      properties:
        pairs:
          $ref: '#/components/schemas/Count'
        lemmas:
          $ref: '#/components/schemas/Count'
        sentences:
          $ref: '#/components/schemas/Count'
        grammar_donors:
          $ref: '#/components/schemas/Count'
      required:
      - pairs
      - lemmas
      - sentences
    SourceManifest:
      type: object
      additionalProperties: false
      properties:
        key:
          $ref: '#/components/schemas/SourceKey'
        name:
          $ref: '#/components/schemas/NonEmptyString'
        homepage:
          type: string
          format: uri
        licence:
          $ref: '#/components/schemas/NonEmptyString'
        licence_url:
          type: string
          format: uri
        attribution:
          $ref: '#/components/schemas/NonEmptyString'
        share_alike:
          type: boolean
        snapshot:
          $ref: '#/components/schemas/NonEmptyString'
        retrieved_at:
          type: string
          format: date-time
          pattern: (Z|\+00:00)$
        files:
          type: array
          items:
            $ref: '#/components/schemas/SourceFile'
        counts:
          $ref: '#/components/schemas/SourceCounts'
        notes:
          type: string
      required:
      - key
      - name
      - homepage
      - licence
      - licence_url
      - attribution
      - share_alike
      - snapshot
      - retrieved_at
      - files
      - counts
      - notes
    SourcesResponse:
      type: object
      additionalProperties: false
      properties:
        dataset_version:
          $ref: '#/components/schemas/NonEmptyString'
        sources:
          type: array
          items:
            $ref: '#/components/schemas/SourceManifest'
      required:
      - dataset_version
      - sources
    LemmaCounts:
      type: object
      additionalProperties: false
      properties:
        de:
          $ref: '#/components/schemas/Count'
        fa:
          $ref: '#/components/schemas/Count'
      required:
      - de
      - fa
    TranslationCounts:
      type: object
      additionalProperties: false
      properties:
        direct:
          $ref: '#/components/schemas/Count'
        pivot_sense:
          $ref: '#/components/schemas/Count'
        pivot_gloss:
          $ref: '#/components/schemas/Count'
        mined:
          $ref: '#/components/schemas/Count'
      required:
      - direct
      - pivot_sense
      - pivot_gloss
      - mined
    SentenceCounts:
      type: object
      additionalProperties: false
      properties:
        direct:
          $ref: '#/components/schemas/Count'
        pivot:
          $ref: '#/components/schemas/Count'
        mined:
          $ref: '#/components/schemas/Count'
      required:
      - direct
      - pivot
      - mined
    StatsResponse:
      type: object
      additionalProperties: false
      properties:
        dataset_version:
          $ref: '#/components/schemas/NonEmptyString'
        lemmas:
          $ref: '#/components/schemas/LemmaCounts'
        translations:
          $ref: '#/components/schemas/TranslationCounts'
        sentences:
          $ref: '#/components/schemas/SentenceCounts'
      required:
      - dataset_version
      - lemmas
      - translations
      - sentences
      description: Counts refer to merged rows in the active dataset. Lemma counts include distinct parts
        of speech for the same headword.
    HealthResponse:
      type: object
      additionalProperties: false
      properties:
        status:
          type: string
          const: ok
        dataset_version:
          $ref: '#/components/schemas/NonEmptyString'
        schema_version:
          type: integer
          minimum: 1
        built_at:
          type: string
          format: date-time
      required:
      - status
      - dataset_version
      - schema_version
      - built_at
    ErrorDetail:
      type: object
      additionalProperties: false
      properties:
        location:
          $ref: '#/components/schemas/StringList'
        message:
          $ref: '#/components/schemas/NonEmptyString'
        type:
          $ref: '#/components/schemas/NonEmptyString'
      required:
      - location
      - message
      - type
    Error:
      type: object
      additionalProperties: false
      properties:
        code:
          type: string
          enum:
          - validation_error
          - not_found
          - dataset_unavailable
        message:
          $ref: '#/components/schemas/NonEmptyString'
        details:
          type: array
          items:
            $ref: '#/components/schemas/ErrorDetail'
      required:
      - code
      - message
      - details
    ErrorResponse:
      type: object
      additionalProperties: false
      properties:
        error:
          $ref: '#/components/schemas/Error'
      required:
      - error
    TranslationSource:
      type: object
      additionalProperties: false
      properties:
        key:
          $ref: '#/components/schemas/SourceKey'
        ref:
          $ref: '#/components/schemas/NonEmptyString'
          description: When the source has a web page for the record, `source_ref` is the absolute https
            URL of that page, for example https://de.wiktionary.org/wiki/Haus. Otherwise it is a locator
            string that a person can follow.
      required:
      - key
      - ref
    SentencesResponse:
      type: object
      additionalProperties: false
      properties:
        dataset_version:
          $ref: '#/components/schemas/NonEmptyString'
        interpreted_query:
          $ref: '#/components/schemas/InterpretedQuery'
        total:
          $ref: '#/components/schemas/Count'
        limit:
          type: integer
          minimum: 1
          maximum: 100
        offset:
          $ref: '#/components/schemas/Count'
        results:
          type: array
          items:
            $ref: '#/components/schemas/EntrySentence'
      required:
      - dataset_version
      - interpreted_query
      - total
      - limit
      - offset
      - results
      description: Total counts matching sentence pairs before pagination. Results retain their source
        key, source reference, licence, and attribution.
    BestTranslation:
      type: object
      additionalProperties: false
      properties:
        pos_index:
          type: integer
          minimum: 0
        translation_index:
          type: integer
          minimum: 0
      required:
      - pos_index
      - translation_index
      description: Zero-based indexes into this result. Each index must be within its parent array. Response
        conformance tests check these relational bounds.
    OtherPosAnswer:
      type: object
      additionalProperties: false
      properties:
        source_pos:
          $ref: '#/components/schemas/Pos'
        translation:
          $ref: '#/components/schemas/Translation'
      required:
      - source_pos
      - translation
    LookupAnswer:
      type: object
      additionalProperties: false
      properties:
        source_lang:
          $ref: '#/components/schemas/Lang'
        source_headword:
          $ref: '#/components/schemas/NonEmptyString'
        source_pos:
          $ref: '#/components/schemas/Pos'
        source_grammar:
          oneOf:
          - $ref: '#/components/schemas/GermanGrammar'
          - $ref: '#/components/schemas/PersianGrammar'
        source_sources:
          type: array
          items:
            $ref: '#/components/schemas/TranslationSource'
        match:
          $ref: '#/components/schemas/Match'
        translation:
          $ref: '#/components/schemas/Translation'
        more_translations:
          type: array
          items:
            $ref: '#/components/schemas/Translation'
          maxItems: 3
        other_pos:
          type: array
          items:
            $ref: '#/components/schemas/OtherPosAnswer'
      required:
      - source_lang
      - source_headword
      - source_pos
      - source_grammar
      - source_sources
      - match
      - translation
      - more_translations
      - other_pos
      allOf:
      - if:
          properties:
            source_lang:
              const: de
        then:
          properties:
            source_grammar:
              $ref: '#/components/schemas/GermanGrammar'
            translation:
              properties:
                lang:
                  const: fa
      - if:
          properties:
            source_lang:
              const: fa
        then:
          properties:
            source_grammar:
              $ref: '#/components/schemas/PersianGrammar'
            translation:
              properties:
                lang:
                  const: de
      - properties:
          match:
            properties:
              type:
                enum:
                - exact
                - form
                - latin
                - fuzzy
          more_translations:
            items:
              properties:
                score:
                  minimum: 0.85
      description: Select supported translations first, then score descending, translation index, and block
        index. More translations use the same block and rank order. Exclude text duplicates of the selected
        translation and earlier alternatives after casefold. Continue through supported translations until
        three distinct alternatives are available or the block ends. Search answers may use translations beyond
        the first five shown in result blocks. Other parts of speech follow block order. Source evidence is
        empty when record references are unavailable. In search, state determines full, partial, corrected
        or ambiguous scope. A fuzzy match is allowed only for an eligible correction preview. These shared
        fields remain full and unchanged on entry responses. Scope and correction evidence live only on SearchResponse.
  headers:
    Link:
      description: Licence of the compiled data and the source list with attribution notices.
      schema:
        type: string
      example: '<https://creativecommons.org/licenses/by-sa/4.0/>; rel="license", </api/v1/sources>; rel="describedby"'
    ETag:
      description: Opaque validator derives from dataset version, response representation, and canonical
        request parameters.
      schema:
        type: string
      example: '"fixture-v1:book-de"'
    DatasetCacheControl:
      description: Successful dataset responses allow public caches for one hour. Health requires revalidation.
      schema:
        type: string
      example: public, max-age=3600
    HealthCacheControl:
      schema:
        type: string
        const: no-cache
      example: no-cache
    ErrorCacheControl:
      schema:
        type: string
        const: no-store
      example: no-store
  examples:
    HealthAvailable:
      value:
        status: ok
        dataset_version: fixture-v1
        built_at: '2026-01-01T00:00:00Z'
        schema_version: 4
      summary: Synthetic fixture data.
    SearchGermanForm:
      value:
        dataset_version: fixture-v1
        interpreted_query:
          raw: Bücher
          detected_lang: de
          normalized: Bücher
        limit: 20
        offset: 0
        total: 1
        results:
        - lang: de
          headword: Buch
          match:
            type: form
            text: Bücher
            readings:
            - form: Bücher
              kind: plural
              tags:
              - plural
          pos_blocks:
          - pos: noun
            labels: []
            grammar:
              genders:
              - n
              plurals:
              - Bücher
              genitives:
              - Buches
              ipa:
              - buːx
              forms: []
              freq_rank: 1
              articles:
              - das
              number: singular
              plural_status: known
            translations:
            - lang: fa
              text: کتاب
              romanization: ketāb
              vocalization: کِتاب
              senses:
              - de: null
                en: book
                fa: null
              labels: []
              link_type: direct
              score: 0.98
              sources:
              - key: fixture_a
                ref: fixture_a:pair:1
              - key: fixture_b
                ref: fixture_b:pair:book
              target_headword: کتاب
              target_pos: noun
              target_grammar:
                plurals:
                - کتاب‌ها
                ipa: []
                romanizations:
                - ketāb
                vocalizations:
                - کِتاب
                forms: []
                freq_rank: 2
              target_sources: []
          best_translation:
            pos_index: 0
            translation_index: 0
        suggestions: []
        answer:
          source_lang: de
          source_headword: Buch
          source_pos: noun
          source_grammar:
            genders:
            - n
            plurals:
            - Bücher
            genitives:
            - Buches
            ipa:
            - buːx
            forms: []
            freq_rank: 1
            articles:
            - das
            number: singular
            plural_status: known
          source_sources: []
          match:
            type: form
            text: Bücher
            readings:
            - form: Bücher
              kind: plural
              tags:
              - plural
          translation:
            lang: fa
            text: کتاب
            romanization: ketāb
            vocalization: کِتاب
            senses:
            - de: null
              en: book
              fa: null
            labels: []
            link_type: direct
            score: 0.98
            sources:
            - key: fixture_a
              ref: fixture_a:pair:1
            - key: fixture_b
              ref: fixture_b:pair:book
            target_headword: کتاب
            target_pos: noun
            target_grammar:
              plurals:
              - کتاب‌ها
              ipa: []
              romanizations:
              - ketāb
              vocalizations:
              - کِتاب
              forms: []
              freq_rank: 2
            target_sources: []
          more_translations: []
          other_pos: []
        segments:
        - start: 0
          end: 6
          surface: Bücher
          kind: word
          keys:
          - lang: de
            key: bucher
          matches:
          - lang: de
            headword: Buch
            lemma_key: de:7f1659871c7a9aa9069006e88a83751d50dd14712d60df15e75094cfa98d94b0
            pos: noun
            match:
              type: form
              text: Bücher
              readings:
              - form: Bücher
                kind: plural
                tags:
                - plural
            source_keys:
            - fixture_a
            - fixture_b
            answer:
              translation:
                lang: fa
                text: کتاب
                score: 0.98
                romanization: ketāb
                vocalization: کِتاب
                target_headword: کتاب
                target_pos: noun
                sources:
                - key: fixture_a
                - key: fixture_b
              more_translations: []
              other_pos: []
            related_spans: []
        segments_complete: true
        state: full
        partial: null
        correction: null
      summary: Synthetic fixture data.
    SearchPersianNormalization:
      value:
        dataset_version: fixture-v1
        interpreted_query:
          raw: كتاب
          detected_lang: fa
          normalized: کتاب
        limit: 20
        offset: 0
        total: 2
        results:
        - lang: fa
          headword: کتاب
          match:
            type: exact
            text: کتاب
          pos_blocks:
          - pos: noun
            labels: []
            grammar:
              plurals:
              - کتاب‌ها
              ipa: []
              romanizations:
              - ketāb
              vocalizations:
              - کِتاب
              forms: []
              freq_rank: 2
            translations:
            - lang: de
              text: Buch
              romanization: null
              vocalization: null
              senses:
              - de: null
                en: book
                fa: null
              labels: []
              link_type: direct
              score: 0.98
              sources:
              - key: fixture_a
                ref: fixture_a:pair:1
              - key: fixture_b
                ref: fixture_b:pair:book
              target_headword: Buch
              target_pos: noun
              target_grammar:
                genders:
                - n
                plurals:
                - Bücher
                genitives:
                - Buches
                ipa:
                - buːx
                forms: []
                freq_rank: 1
                articles:
                - das
                number: singular
                plural_status: known
              target_sources: []
          best_translation:
            pos_index: 0
            translation_index: 0
        - lang: fa
          headword: کتاب‌فروشی
          match:
            type: prefix
            text: کتاب‌فروشی
          pos_blocks:
          - pos: noun
            labels: []
            grammar:
              plurals: []
              ipa: []
              romanizations:
              - ketāb-foruši
              vocalizations:
              - کِتاب‌فُروشی
              forms: []
              freq_rank: 91
            translations:
            - lang: de
              text: Buchhandlung
              romanization: null
              vocalization: null
              senses:
              - de: null
                en: bookshop
                fa: null
              labels: []
              link_type: direct
              score: 0.98
              sources:
              - key: fixture_b
                ref: fixture_b:pair:47
              target_headword: Buchhandlung
              target_pos: noun
              target_grammar:
                genders:
                - f
                plurals:
                - Buchhandlungen
                genitives: []
                ipa: []
                forms: []
                freq_rank: 90
                articles:
                - die
                number: singular
                plural_status: known
              target_sources: []
          best_translation:
            pos_index: 0
            translation_index: 0
        suggestions: []
        answer:
          source_lang: fa
          source_headword: کتاب
          source_pos: noun
          source_grammar:
            plurals:
            - کتاب‌ها
            ipa: []
            romanizations:
            - ketāb
            vocalizations:
            - کِتاب
            forms: []
            freq_rank: 2
          source_sources: []
          match:
            type: exact
            text: کتاب
          translation:
            lang: de
            text: Buch
            romanization: null
            vocalization: null
            senses:
            - de: null
              en: book
              fa: null
            labels: []
            link_type: direct
            score: 0.98
            sources:
            - key: fixture_a
              ref: fixture_a:pair:1
            - key: fixture_b
              ref: fixture_b:pair:book
            target_headword: Buch
            target_pos: noun
            target_grammar:
              genders:
              - n
              plurals:
              - Bücher
              genitives:
              - Buches
              ipa:
              - buːx
              forms: []
              freq_rank: 1
              articles:
              - das
              number: singular
              plural_status: known
            target_sources: []
          more_translations: []
          other_pos: []
        segments:
        - start: 0
          end: 4
          surface: كتاب
          kind: word
          keys:
          - lang: fa
            key: کتاب
          matches:
          - lang: fa
            headword: کتاب
            lemma_key: fa:7ac199c11c8739bc5b5e6e011885a19f80002f66357434d2113836ff134c20da
            pos: noun
            match:
              type: exact
              text: کتاب
            source_keys:
            - fixture_a
            - fixture_b
            answer:
              translation:
                lang: de
                text: Buch
                score: 0.98
                romanization: null
                vocalization: null
                target_headword: Buch
                target_pos: noun
                sources:
                - key: fixture_a
                - key: fixture_b
              more_translations: []
              other_pos: []
            related_spans: []
        segments_complete: true
        state: full
        partial: null
        correction: null
      summary: Synthetic fixture data.
    SearchNoMatch:
      value:
        dataset_version: fixture-v1
        interpreted_query:
          raw: Bcu
          detected_lang: de
          normalized: Bcu
        limit: 20
        offset: 0
        total: 0
        results: []
        suggestions: []
        answer: null
        segments:
        - start: 0
          end: 3
          surface: Bcu
          kind: unresolved
          keys:
          - lang: de
            key: bcu
          matches: []
        segments_complete: true
        state: missing
        partial: null
        correction: null
      summary: Synthetic fixture data.
    SearchFuzzyMatch:
      value:
        dataset_version: fixture-v1
        interpreted_query:
          raw: Bucj
          detected_lang: de
          normalized: Bucj
        limit: 20
        offset: 0
        total: 0
        results:
        - lang: de
          headword: Buch
          match:
            type: fuzzy
            text: Buch
          pos_blocks:
          - pos: noun
            labels: []
            grammar:
              genders:
              - n
              plurals:
              - Bücher
              genitives:
              - Buches
              ipa:
              - buːx
              forms: []
              freq_rank: 1
              articles:
              - das
              number: singular
              plural_status: known
            translations:
            - lang: fa
              text: کتاب
              romanization: ketāb
              vocalization: کِتاب
              senses:
              - de: null
                en: book
                fa: null
              labels: []
              link_type: direct
              score: 0.98
              sources:
              - key: fixture_a
                ref: fixture_a:pair:1
              - key: fixture_b
                ref: fixture_b:pair:book
              target_headword: کتاب
              target_pos: noun
              target_grammar:
                plurals:
                - کتاب‌ها
                ipa: []
                romanizations:
                - ketāb
                vocalizations:
                - کِتاب
                forms: []
                freq_rank: 2
              target_sources: []
          best_translation:
            pos_index: 0
            translation_index: 0
        suggestions:
        - lang: de
          headword: Buch
          pos:
          - noun
        answer:
          source_lang: de
          source_headword: Buch
          source_pos: noun
          source_grammar:
            genders:
            - n
            plurals:
            - Bücher
            genitives:
            - Buches
            ipa:
            - buːx
            forms: []
            freq_rank: 1
            articles:
            - das
            number: singular
            plural_status: known
          source_sources: []
          match:
            type: fuzzy
            text: Buch
          translation:
            lang: fa
            text: کتاب
            romanization: ketāb
            vocalization: کِتاب
            senses:
            - de: null
              en: book
              fa: null
            labels: []
            link_type: direct
            score: 0.98
            sources:
            - key: fixture_a
              ref: fixture_a:pair:1
            - key: fixture_b
              ref: fixture_b:pair:book
            target_headword: کتاب
            target_pos: noun
            target_grammar:
              plurals:
              - کتاب‌ها
              ipa: []
              romanizations:
              - ketāb
              vocalizations:
              - کِتاب
              forms: []
              freq_rank: 2
            target_sources: []
          more_translations: []
          other_pos: []
        segments:
        - start: 0
          end: 4
          surface: Bucj
          kind: unresolved
          keys:
          - lang: de
            key: bucj
          matches: []
        segments_complete: true
        state: corrected
        partial: null
        correction:
          raw: Bucj
          complete: true
          distance: 1
          initial_preserved: true
          candidates:
          - lang: de
            headword: Buch
            lemma_key: de:7f1659871c7a9aa9069006e88a83751d50dd14712d60df15e75094cfa98d94b0
            pos: noun
            match:
              type: fuzzy
              text: Buch
            source_keys:
            - fixture_a
            - fixture_b
            answer:
              translation:
                lang: fa
                text: کتاب
                score: 0.98
                romanization: ketāb
                vocalization: کِتاب
                target_headword: کتاب
                target_pos: noun
                sources:
                - key: fixture_a
                - key: fixture_b
              more_translations: []
              other_pos: []
            related_spans: []
      summary: Synthetic fixture data.
    SuggestPrefix:
      value:
        dataset_version: fixture-v1
        interpreted_query:
          raw: Bu
          detected_lang: de
          normalized: Bu
        results:
        - lang: de
          headword: Buch
          pos:
          - noun
        - lang: de
          headword: Buchhandlung
          pos:
          - noun
      summary: Synthetic fixture data.
    EntryGerman:
      value:
        dataset_version: fixture-v1
        lang: de
        headword: Buch
        pos_blocks:
        - pos: noun
          labels: []
          grammar:
            genders:
            - n
            plurals:
            - Bücher
            genitives:
            - Buches
            ipa:
            - buːx
            forms: []
            freq_rank: 1
            articles:
            - das
            number: singular
            plural_status: known
          translations:
          - lang: fa
            text: کتاب
            romanization: ketāb
            vocalization: کِتاب
            senses:
            - de: null
              en: book
              fa: null
            labels: []
            link_type: direct
            score: 0.98
            sources:
            - key: fixture_a
              ref: fixture_a:pair:1
            - key: fixture_b
              ref: fixture_b:pair:book
            target_headword: کتاب
            target_pos: noun
            target_grammar:
              plurals:
              - کتاب‌ها
              ipa: []
              romanizations:
              - ketāb
              vocalizations:
              - کِتاب
              forms: []
              freq_rank: 2
            target_sources: []
        answer:
          source_lang: de
          source_headword: Buch
          source_pos: noun
          source_grammar:
            genders:
            - n
            plurals:
            - Bücher
            genitives:
            - Buches
            ipa:
            - buːx
            forms: []
            freq_rank: 1
            articles:
            - das
            number: singular
            plural_status: known
          source_sources: []
          match:
            type: exact
            text: Buch
          translation:
            lang: fa
            text: کتاب
            romanization: ketāb
            vocalization: کِتاب
            senses:
            - de: null
              en: book
              fa: null
            labels: []
            link_type: direct
            score: 0.98
            sources:
            - key: fixture_a
              ref: fixture_a:pair:1
            - key: fixture_b
              ref: fixture_b:pair:book
            target_headword: کتاب
            target_pos: noun
            target_grammar:
              plurals:
              - کتاب‌ها
              ipa: []
              romanizations:
              - ketāb
              vocalizations:
              - کِتاب
              forms: []
              freq_rank: 2
            target_sources: []
          more_translations: []
          other_pos: []
        related: []
        related_total: 0
        related_limit: 20
        related_offset: 0
        sentences:
        - de: Ich lese ein Buch.
          fa: من یک کتاب می‌خوانم.
          alignment: direct
          source_key: fixture_a
          source_ref: fixture_a:sentence:1
          licence: CC0-1.0
          attribution: Synthetic hand-authored Fixture A sentence examples.
          quality: 0.96
          id: 70e89744193145519eafd6e406497d995ef75927d66ec5693083f900d1b79abb
          lemma_keys:
          - de:2d63ea98be9793c36629d00c5bd03c458a8f99bd02d31deeaacd79922f0ea8d9
          - de:7f1659871c7a9aa9069006e88a83751d50dd14712d60df15e75094cfa98d94b0
          - fa:7ac199c11c8739bc5b5e6e011885a19f80002f66357434d2113836ff134c20da
          - fa:c988870178b486c059a23d19243d7bee60f1ee643ee7b297a5301097f4d0b563
        sentences_total: 1
        sentences_limit: 10
        sentences_offset: 0
      summary: Synthetic fixture data.
    EntryPersian:
      value:
        dataset_version: fixture-v1
        lang: fa
        headword: کتاب
        pos_blocks:
        - pos: noun
          labels: []
          grammar:
            plurals:
            - کتاب‌ها
            ipa: []
            romanizations:
            - ketāb
            vocalizations:
            - کِتاب
            forms: []
            freq_rank: 2
          translations:
          - lang: de
            text: Buch
            romanization: null
            vocalization: null
            senses:
            - de: null
              en: book
              fa: null
            labels: []
            link_type: direct
            score: 0.98
            sources:
            - key: fixture_a
              ref: fixture_a:pair:1
            - key: fixture_b
              ref: fixture_b:pair:book
            target_headword: Buch
            target_pos: noun
            target_grammar:
              genders:
              - n
              plurals:
              - Bücher
              genitives:
              - Buches
              ipa:
              - buːx
              forms: []
              freq_rank: 1
              articles:
              - das
              number: singular
              plural_status: known
            target_sources: []
        answer:
          source_lang: fa
          source_headword: کتاب
          source_pos: noun
          source_grammar:
            plurals:
            - کتاب‌ها
            ipa: []
            romanizations:
            - ketāb
            vocalizations:
            - کِتاب
            forms: []
            freq_rank: 2
          source_sources: []
          match:
            type: exact
            text: کتاب
          translation:
            lang: de
            text: Buch
            romanization: null
            vocalization: null
            senses:
            - de: null
              en: book
              fa: null
            labels: []
            link_type: direct
            score: 0.98
            sources:
            - key: fixture_a
              ref: fixture_a:pair:1
            - key: fixture_b
              ref: fixture_b:pair:book
            target_headword: Buch
            target_pos: noun
            target_grammar:
              genders:
              - n
              plurals:
              - Bücher
              genitives:
              - Buches
              ipa:
              - buːx
              forms: []
              freq_rank: 1
              articles:
              - das
              number: singular
              plural_status: known
            target_sources: []
          more_translations: []
          other_pos: []
        related: []
        related_total: 0
        related_limit: 20
        related_offset: 0
        sentences:
        - de: Ich lese ein Buch.
          fa: من یک کتاب می‌خوانم.
          alignment: direct
          source_key: fixture_a
          source_ref: fixture_a:sentence:1
          licence: CC0-1.0
          attribution: Synthetic hand-authored Fixture A sentence examples.
          quality: 0.96
          id: 70e89744193145519eafd6e406497d995ef75927d66ec5693083f900d1b79abb
          lemma_keys:
          - de:2d63ea98be9793c36629d00c5bd03c458a8f99bd02d31deeaacd79922f0ea8d9
          - de:7f1659871c7a9aa9069006e88a83751d50dd14712d60df15e75094cfa98d94b0
          - fa:7ac199c11c8739bc5b5e6e011885a19f80002f66357434d2113836ff134c20da
          - fa:c988870178b486c059a23d19243d7bee60f1ee643ee7b297a5301097f4d0b563
        sentences_total: 1
        sentences_limit: 10
        sentences_offset: 0
      summary: Synthetic fixture data.
    EntryRelatedProverb:
      value:
        dataset_version: fixture-v1
        lang: fa
        headword: کار
        pos_blocks:
        - pos: noun
          labels: []
          grammar:
            plurals: []
            ipa: []
            romanizations: []
            vocalizations: []
            forms: []
            freq_rank: 62
          translations:
          - lang: de
            text: Arbeit
            romanization: null
            vocalization: null
            senses:
            - de: null
              en: work
              fa: null
            labels: []
            link_type: direct
            score: 0.98
            sources:
            - key: fixture_b
              ref: fixture_b:pair:32
            target_headword: Arbeit
            target_pos: noun
            target_grammar:
              genders:
              - f
              plurals:
              - Arbeiten
              genitives: []
              ipa: []
              forms: []
              freq_rank: 61
              articles:
              - die
              number: singular
              plural_status: known
            target_sources: []
        answer:
          source_lang: fa
          source_headword: کار
          source_pos: noun
          source_grammar:
            plurals: []
            ipa: []
            romanizations: []
            vocalizations: []
            forms: []
            freq_rank: 62
          source_sources: []
          match:
            type: exact
            text: کار
          translation:
            lang: de
            text: Arbeit
            romanization: null
            vocalization: null
            senses:
            - de: null
              en: work
              fa: null
            labels: []
            link_type: direct
            score: 0.98
            sources:
            - key: fixture_b
              ref: fixture_b:pair:32
            target_headword: Arbeit
            target_pos: noun
            target_grammar:
              genders:
              - f
              plurals:
              - Arbeiten
              genitives: []
              ipa: []
              forms: []
              freq_rank: 61
              articles:
              - die
              number: singular
              plural_status: known
            target_sources: []
          more_translations: []
          other_pos: []
        related:
        - lang: fa
          headword: کار کردن
          pos: verb
          translations:
          - lang: de
            text: arbeiten
            romanization: null
            vocalization: null
            senses:
            - de: null
              en: work
              fa: null
            labels: []
            link_type: direct
            score: 0.98
            sources:
            - key: fixture_b
              ref: fixture_b:pair:61
            target_headword: arbeiten
            target_pos: verb
            target_grammar:
              genders: []
              plurals: []
              genitives: []
              ipa: []
              forms:
              - form: arbeitete
                tags:
                - past
              - form: gearbeitet
                tags:
                - past_participle
              freq_rank: 118
              articles: []
              number: unknown
              plural_status: unknown
            target_sources: []
        - lang: fa
          headword: کار نیکو کردن از پر کردن است
          pos: proverb
          translations:
          - lang: de
            text: Übung macht den Meister
            romanization: null
            vocalization: null
            senses:
            - de: null
              en: practice makes perfect
              fa: null
            labels: []
            link_type: direct
            score: 0.98
            sources:
            - key: fixture_c
              ref: https://fixture-c.invalid/wiki/%C3%9Cbung%20macht%20den%20Meister
            target_headword: Übung macht den Meister
            target_pos: proverb
            target_grammar:
              genders: []
              plurals: []
              genitives: []
              ipa: []
              forms: []
              freq_rank: 170
              articles: []
              number: unknown
              plural_status: unknown
            target_sources: []
        related_total: 2
        related_limit: 20
        related_offset: 0
        sentences: []
        sentences_total: 0
        sentences_limit: 10
        sentences_offset: 0
      summary: Synthetic fixture data.
    FormIndexGerman:
      value:
        dataset_version: fixture-v1
        lang: de
        headwords:
        - Apfel
        - Arbeit
        - Bank
        - Baum
        - Blume
        - Brot
        - Bruder
        - Buch
        - Buchhandlung
        - Bäcker
        - Familie
        - Fenster
        - Freund
        - Freundin
        - Frühstück
        - Fuß
        - Hand
        - Haus
        - Herz
        - Hilfe
        - Joghurt
        - Kaffee
        - Kamerad
        - Kind
        - Kopf
        - Lehrer
        - Löwe
        - Milch
        - Museum
        - Mutter
        - Nacht
        - Obstverkäufer
        - Schlamm
        - Schule
        - Schwester
        - Sprache
        - Stadt
        - Straße
        - Stuhl
        - Tag
        - Tee
        - Tisch
        - Tür
        - U-Bahn
        - Vater
        - Wasser
        - Wort
        - Zeit
        - alt
        - ankommen
        - arbeiten
        - aufstehen
        - dort
        - essen
        - gehen
        - gestern
        - groß
        - gut
        - guten Abend
        - guten Morgen
        - helfen
        - heute
        - hier
        - hören
        - ins Gras beißen
        - kalt
        - klein
        - kommen
        - langsam
        - laut
        - leise
        - lernen
        - lesen
        - morgen
        - mögen
        - neu
        - nur Bahnhof verstehen
        - sagen
        - schlafen
        - schnell
        - schreiben
        - schön
        - sehen
        - sprechen
        - trinken
        - warm
        - Übung macht den Meister
        ranks:
        - 23
        - 61
        - 33
        - 9
        - 11
        - 15
        - 71
        - 1
        - 90
        - 75
        - 63
        - 27
        - 39
        - 41
        - 77
        - 84
        - 49
        - 3
        - 53
        - 86
        - 35
        - 19
        - 42
        - 37
        - 51
        - 73
        - 79
        - 17
        - 80
        - 65
        - 47
        - 88
        - null
        - 55
        - 69
        - 57
        - 7
        - 5
        - 31
        - 45
        - 21
        - 29
        - 25
        - 82
        - 67
        - 13
        - 59
        - 43
        - 140
        - 96
        - 118
        - 122
        - 160
        - 112
        - 92
        - 156
        - 132
        - 128
        - 164
        - 162
        - 120
        - 152
        - 158
        - 110
        - 166
        - 144
        - 130
        - 94
        - 136
        - 146
        - 148
        - 106
        - 102
        - 154
        - 124
        - 138
        - 168
        - 98
        - 116
        - 134
        - 104
        - 126
        - 108
        - 100
        - 114
        - 142
        - 170
        forms:
          Apfels:
          - 0
          Arbeiten:
          - 1
          Banken:
          - 2
          Baumes:
          - 3
          Blumen:
          - 4
          Brote:
          - 5
          Brotes:
          - 5
          Bruders:
          - 6
          Brüder:
          - 6
          Buches:
          - 7
          Buchhandlungen:
          - 8
          Bäckers:
          - 9
          Bänke:
          - 2
          Bäume:
          - 3
          Bücher:
          - 7
          Familien:
          - 10
          Fensters:
          - 11
          Freunde:
          - 12
          Freundes:
          - 12
          Freundinnen:
          - 13
          Frühstücke:
          - 14
          Frühstücks:
          - 14
          Fußes:
          - 15
          Füße:
          - 15
          Hauses:
          - 17
          Herzen:
          - 18
          Herzens:
          - 18
          Hilfen:
          - 19
          Hände:
          - 16
          Häuser:
          - 17
          Joghurts:
          - 20
          Kaffees:
          - 21
          Kameraden:
          - 22
          Kinder:
          - 23
          Kindes:
          - 23
          Kopfes:
          - 24
          Köpfe:
          - 24
          Lehrers:
          - 25
          Löwen:
          - 26
          Museen:
          - 28
          Museums:
          - 28
          Mütter:
          - 29
          Nächte:
          - 30
          Obstverkäufers:
          - 31
          Schulen:
          - 33
          Schwestern:
          - 34
          Sprachen:
          - 35
          Straßen:
          - 37
          Stuhles:
          - 38
          Städte:
          - 36
          Stühle:
          - 38
          Tage:
          - 39
          Tages:
          - 39
          Tees:
          - 40
          Tische:
          - 41
          Tisches:
          - 41
          Türen:
          - 42
          U-Bahnen:
          - 43
          Vaters:
          - 44
          Väter:
          - 44
          Wassers:
          - 45
          Wortes:
          - 46
          Wörter:
          - 46
          Zeiten:
          - 47
          am besten:
          - 57
          am größten:
          - 56
          am schönsten:
          - 81
          angekommen:
          - 49
          arbeitete:
          - 50
          aufgestanden:
          - 51
          aß:
          - 53
          besser:
          - 57
          gearbeitet:
          - 50
          gegangen:
          - 54
          gegessen:
          - 53
          geholfen:
          - 60
          gehört:
          - 63
          gekommen:
          - 67
          gelernt:
          - 71
          gelesen:
          - 72
          gemocht:
          - 74
          gesagt:
          - 77
          geschlafen:
          - 78
          geschrieben:
          - 80
          gesehen:
          - 82
          gesprochen:
          - 83
          getrunken:
          - 84
          ging:
          - 54
          größer:
          - 56
          half:
          - 60
          hörte:
          - 63
          kam:
          - 67
          kam an:
          - 49
          kommt an:
          - 49
          las:
          - 72
          lernte:
          - 71
          mochte:
          - 74
          sagte:
          - 77
          sah:
          - 82
          schlief:
          - 78
          schrieb:
          - 80
          schöner:
          - 81
          sprach:
          - 83
          stand auf:
          - 51
          steht auf:
          - 51
          trank:
          - 84
          Äpfel:
          - 0
      summary: Synthetic fixture data.
    HeadwordsFirstPage:
      value:
        dataset_version: fixture-v1
        lang: de
        headwords:
        - Apfel
        - Arbeit
        - Bank
        next_after: Bank
      summary: Synthetic fixture data.
    SourcesSyntheticSources:
      value:
        dataset_version: fixture-v1
        sources:
        - key: fixture_a
          name: Synthetic Fixture A
          homepage: https://fixture-a.invalid
          licence: CC0-1.0
          licence_url: https://creativecommons.org/publicdomain/zero/1.0/
          attribution: Synthetic hand-authored Fixture A credits; no upstream data.
          share_alike: false
          snapshot: synthetic-2026-10-08
          retrieved_at: '2026-10-08T00:00:00Z'
          files:
          - bytes: 61072
            sha256: 49e853a041bf795ddcf57d2c4b2104d51f122a57945dda0910ff43b8cd90008a
            url: https://fixture-a.invalid/merged/lemmas.jsonl
          - bytes: 36096
            sha256: 5a935237de80683b34eff7953024d3f59e235026448e0c14115efd80691f2282
            url: https://fixture-a.invalid/merged/translations.jsonl
          - bytes: 10997
            sha256: fcdea562b3f064a35c3c28f004d06f14b94793e0330c2877efc31a93021ec5ad
            url: https://fixture-a.invalid/merged/sentences.jsonl
          counts:
            lemmas: 53
            pairs: 27
            sentences: 6
          notes: All records are synthetic hand-authored fixtures. Licence fields test metadata; they do
            not cite upstream evidence. Retrieval dates are fixture values.
        - key: fixture_b
          name: Synthetic Fixture B
          homepage: https://fixture-b.invalid
          licence: CC-BY-4.0
          licence_url: https://creativecommons.org/licenses/by/4.0/
          attribution: Synthetic hand-authored Fixture B credits; no upstream data.
          share_alike: false
          snapshot: synthetic-2026-10-08
          retrieved_at: '2026-10-08T00:00:00Z'
          files:
          - bytes: 61072
            sha256: 49e853a041bf795ddcf57d2c4b2104d51f122a57945dda0910ff43b8cd90008a
            url: https://fixture-b.invalid/merged/lemmas.jsonl
          - bytes: 36096
            sha256: 5a935237de80683b34eff7953024d3f59e235026448e0c14115efd80691f2282
            url: https://fixture-b.invalid/merged/translations.jsonl
          - bytes: 10997
            sha256: fcdea562b3f064a35c3c28f004d06f14b94793e0330c2877efc31a93021ec5ad
            url: https://fixture-b.invalid/merged/sentences.jsonl
          counts:
            lemmas: 70
            pairs: 35
            sentences: 6
          notes: All records are synthetic hand-authored fixtures. Licence fields test metadata; they do
            not cite upstream evidence. Retrieval dates are fixture values.
        - key: fixture_c
          name: Synthetic Fixture C
          homepage: https://fixture-c.invalid
          licence: CC-BY-SA-4.0
          licence_url: https://creativecommons.org/licenses/by-sa/4.0/
          attribution: Synthetic hand-authored Fixture C credits; no upstream data.
          share_alike: true
          snapshot: synthetic-2026-10-08
          retrieved_at: '2026-10-08T00:00:00Z'
          files:
          - bytes: 61072
            sha256: 49e853a041bf795ddcf57d2c4b2104d51f122a57945dda0910ff43b8cd90008a
            url: https://fixture-c.invalid/merged/lemmas.jsonl
          - bytes: 36096
            sha256: 5a935237de80683b34eff7953024d3f59e235026448e0c14115efd80691f2282
            url: https://fixture-c.invalid/merged/translations.jsonl
          - bytes: 10997
            sha256: fcdea562b3f064a35c3c28f004d06f14b94793e0330c2877efc31a93021ec5ad
            url: https://fixture-c.invalid/merged/sentences.jsonl
          counts:
            lemmas: 63
            pairs: 32
            sentences: 6
          notes: All records are synthetic hand-authored fixtures. Licence fields test metadata; they do
            not cite upstream evidence. Retrieval dates are fixture values.
      summary: Synthetic fixture data.
    StatsSyntheticCounts:
      value:
        dataset_version: fixture-v1
        lemmas:
          de: 88
          fa: 88
        translations:
          direct: 90
          pivot_sense: 1
          pivot_gloss: 1
          mined: 1
        sentences:
          direct: 6
          pivot: 6
          mined: 6
      summary: Synthetic fixture data.
    ValidationError:
      summary: Synthetic fixture error.
      value:
        error:
          code: validation_error
          message: Invalid request parameters.
          details:
          - location:
            - query
            - q
            message: Query must contain 1 to 200 characters.
            type: string_length
    NotFound:
      summary: Synthetic fixture error.
      value:
        error:
          code: not_found
          message: Headword not found.
          details: []
    DatasetUnavailable:
      summary: Synthetic fixture error.
      value:
        error:
          code: dataset_unavailable
          message: Dictionary data are unavailable.
          details: []
    EntryGermanUsageLabels:
      value:
        dataset_version: fixture-v1
        lang: de
        headword: ins Gras beißen
        pos_blocks:
        - pos: idiom
          labels:
          - colloquial
          grammar:
            genders: []
            plurals: []
            genitives: []
            ipa: []
            forms: []
            freq_rank: 166
            articles: []
            number: unknown
            plural_status: unknown
          translations:
          - lang: fa
            text: جان دادن
            romanization: null
            vocalization: null
            senses:
            - de: null
              en: die
              fa: null
            labels:
            - figurative
            link_type: direct
            score: 0.98
            sources:
            - key: fixture_c
              ref: https://fixture-c.invalid/wiki/ins%20Gras%20bei%C3%9Fen
            target_headword: جان دادن
            target_pos: idiom
            target_grammar:
              plurals: []
              ipa: []
              romanizations: []
              vocalizations: []
              forms: []
              freq_rank: 167
            target_sources: []
        answer:
          source_lang: de
          source_headword: ins Gras beißen
          source_pos: idiom
          source_grammar:
            genders: []
            plurals: []
            genitives: []
            ipa: []
            forms: []
            freq_rank: 166
            articles: []
            number: unknown
            plural_status: unknown
          source_sources: []
          match:
            type: exact
            text: ins Gras beißen
          translation:
            lang: fa
            text: جان دادن
            romanization: null
            vocalization: null
            senses:
            - de: null
              en: die
              fa: null
            labels:
            - figurative
            link_type: direct
            score: 0.98
            sources:
            - key: fixture_c
              ref: https://fixture-c.invalid/wiki/ins%20Gras%20bei%C3%9Fen
            target_headword: جان دادن
            target_pos: idiom
            target_grammar:
              plurals: []
              ipa: []
              romanizations: []
              vocalizations: []
              forms: []
              freq_rank: 167
            target_sources: []
          more_translations: []
          other_pos: []
        related: []
        related_total: 0
        related_limit: 20
        related_offset: 0
        sentences: []
        sentences_total: 0
        sentences_limit: 10
        sentences_offset: 0
      summary: Synthetic fixture data.
    SearchPersianUsageLabels:
      value:
        dataset_version: fixture-v1
        interpreted_query:
          raw: نیکو
          detected_lang: fa
          normalized: نیکو
        limit: 20
        offset: 0
        total: 2
        results:
        - lang: fa
          headword: نیکو
          match:
            type: exact
            text: نیکو
          pos_blocks:
          - pos: adjective
            labels:
            - literary
            grammar:
              plurals: []
              ipa: []
              romanizations:
              - niku
              vocalizations: []
              forms: []
              freq_rank: 175
            translations:
            - lang: de
              text: gut
              romanization: null
              vocalization: null
              senses:
              - de: null
                en: good; literary
                fa: null
              labels:
              - literary
              link_type: mined
              score: 0.8
              sources:
              - key: fixture_c
                ref: https://fixture-c.invalid/wiki/gut
              target_headword: gut
              target_pos: adjective
              target_grammar:
                genders: []
                plurals: []
                genitives: []
                ipa: []
                forms:
                - form: besser
                  tags:
                  - comparative
                - form: am besten
                  tags:
                  - superlative
                freq_rank: 128
                articles: []
                number: unknown
                plural_status: unknown
              target_sources: []
            - lang: de
              text: schön
              romanization: null
              vocalization: null
              senses:
              - de: null
                en: fine; literary
                fa: null
              labels:
              - literary
              link_type: pivot_gloss
              score: 0.72
              sources:
              - key: fixture_a
                ref: fixture_a:pair:91
              target_headword: schön
              target_pos: adjective
              target_grammar:
                genders: []
                plurals: []
                genitives: []
                ipa: []
                forms:
                - form: schöner
                  tags:
                  - comparative
                - form: am schönsten
                  tags:
                  - superlative
                freq_rank: 126
                articles: []
                number: unknown
                plural_status: unknown
              target_sources: []
          best_translation:
            pos_index: 0
            translation_index: 0
        - lang: fa
          headword: کار نیکو کردن از پر کردن است
          match:
            type: substring
            text: کار نیکو کردن از پر کردن است
          pos_blocks:
          - pos: proverb
            labels: []
            grammar:
              plurals: []
              ipa: []
              romanizations: []
              vocalizations: []
              forms: []
              freq_rank: 171
            translations:
            - lang: de
              text: Übung macht den Meister
              romanization: null
              vocalization: null
              senses:
              - de: null
                en: practice makes perfect
                fa: null
              labels: []
              link_type: direct
              score: 0.98
              sources:
              - key: fixture_c
                ref: https://fixture-c.invalid/wiki/%C3%9Cbung%20macht%20den%20Meister
              target_headword: Übung macht den Meister
              target_pos: proverb
              target_grammar:
                genders: []
                plurals: []
                genitives: []
                ipa: []
                forms: []
                freq_rank: 170
                articles: []
                number: unknown
                plural_status: unknown
              target_sources: []
          best_translation:
            pos_index: 0
            translation_index: 0
        suggestions: []
        answer:
          source_lang: fa
          source_headword: نیکو
          source_pos: adjective
          source_grammar:
            plurals: []
            ipa: []
            romanizations:
            - niku
            vocalizations: []
            forms: []
            freq_rank: 175
          source_sources: []
          match:
            type: exact
            text: نیکو
          translation:
            lang: de
            text: gut
            romanization: null
            vocalization: null
            senses:
            - de: null
              en: good; literary
              fa: null
            labels:
            - literary
            link_type: mined
            score: 0.8
            sources:
            - key: fixture_c
              ref: https://fixture-c.invalid/wiki/gut
            target_headword: gut
            target_pos: adjective
            target_grammar:
              genders: []
              plurals: []
              genitives: []
              ipa: []
              forms:
              - form: besser
                tags:
                - comparative
              - form: am besten
                tags:
                - superlative
              freq_rank: 128
              articles: []
              number: unknown
              plural_status: unknown
            target_sources: []
          more_translations: []
          other_pos: []
        segments:
        - start: 0
          end: 4
          surface: نیکو
          kind: word
          keys:
          - lang: fa
            key: نیکو
          matches:
          - lang: fa
            headword: نیکو
            lemma_key: fa:ad900bc6070b7bb6b0075c8ab822b2524e430352c83cdc65e9ad9928e1c1fdcc
            pos: adjective
            match:
              type: exact
              text: نیکو
            source_keys:
            - fixture_a
            - fixture_c
            answer:
              translation:
                lang: de
                text: gut
                score: 0.8
                romanization: null
                vocalization: null
                target_headword: gut
                target_pos: adjective
                sources:
                - key: fixture_c
              more_translations: []
              other_pos: []
            related_spans: []
        segments_complete: true
        state: full
        partial: null
        correction: null
      summary: Synthetic fixture data.
    SentencesGerman:
      value:
        dataset_version: fixture-v1
        interpreted_query:
          raw: ist
          detected_lang: de
          normalized: ist
        total: 5
        limit: 20
        offset: 0
        results:
        - de: Die Buchhandlung ist hier.
          fa: کتاب‌فروشی اینجاست.
          alignment: direct
          source_key: fixture_a
          source_ref: fixture_a:sentence:16
          licence: CC0-1.0
          attribution: Synthetic hand-authored Fixture A sentence examples.
          quality: 0.96
          id: fbf18388e4a281000739c8a16ab66a9e564825b60253f5a21f261c6eb8014cbd
          lemma_keys:
          - de:7ff684b6e8a8750136250600244212c4999a4bcf6832a03f96f74266133db6f2
          - de:d477b0d1d0d20a3456ec89a941785cf34c1500048cc131d04b5072316e826f48
          - fa:88239ffc53a9915956d944e36d7b902282236661a24e2c39474f3cbfbbd8cca1
          - fa:a2f94f921e3f7feccfeb7b1538fd87cefec243e0470b5f673f70e7b6b411547e
        - de: Das Haus ist groß.
          fa: خانه بزرگ است.
          alignment: pivot
          source_key: fixture_b
          source_ref: fixture_b:sentence:2
          licence: CC-BY-4.0
          attribution: Synthetic hand-authored Fixture B sentence examples.
          quality: 0.85
          id: faee57738463cc3d2e59cf2347d62be97c22c2327f243457dbf98f7d6ae42040
          lemma_keys:
          - de:c663ec1fb3d6fb6e9cafcd43a44368fe1089d4864f0534467e7c171f4552103b
          - de:e011d8a7054fcdcc710a23d98a917229c92c9cd8ac69496c7fecb6d24be9bb5f
          - fa:aabc51a7adbb7a31e29308bd279ecd07eaf9dad3e70a7cb8806b682b0ef63304
          - fa:ba20664a7be76c53df5665a42e111605475f6b68814b1628ba24015d329e06a7
        - de: Die Straße ist lang.
          fa: خیابان طولانی است.
          alignment: mined
          source_key: fixture_c
          source_ref: https://fixture-c.invalid/sentences/3
          licence: CC-BY-SA-4.0
          attribution: Synthetic hand-authored Fixture C sentence examples.
          quality: 0.7
          id: 8467370dd1edd2da59d4fb3d66e924a12afbc5ee1b98ce0ce6cbe18d9a61fd7f
          lemma_keys:
          - de:d414813ca2f74293c173f490559211b40c296ff5ed05f6077e55a21ae1fb4ab3
          - fa:22aaf123e7c7ce031554ad7c7b6a1bcd9ee2479a4a78edae6e74c546573929b1
        - de: Der Joghurt ist kalt.
          fa: ماست سرد است.
          alignment: mined
          source_key: fixture_c
          source_ref: https://fixture-c.invalid/sentences/15
          licence: CC-BY-SA-4.0
          attribution: Synthetic hand-authored Fixture C sentence examples.
          quality: 0.7
          id: c53577077045850528709b210956f80f226e5d858082d80ad418ae5c15b59adb
          lemma_keys:
          - de:7ce0c507bbfb862059dcdaca1bddc1d7f69aeaeacadbba0389c08ceeb3967199
          - de:d91318d2defe73d6a840147e7b6c21ec1f932c925ff564b1bc7a213794a1d9c3
          - fa:787cc18b765c4e750b11338494295a4b9fca69aae76084427e11b8fa21911047
          - fa:c0d3cd90faebb2707f61dc1ad22c2c0394d244dbb7aa04455fe83730b6ba10d6
        - de: Die Bank ist heute geschlossen.
          fa: بانک امروز بسته است.
          alignment: mined
          source_key: fixture_c
          source_ref: https://fixture-c.invalid/sentences/12
          licence: CC-BY-SA-4.0
          attribution: Synthetic hand-authored Fixture C sentence examples.
          quality: 0.7
          id: 66d6e89f34597526b05a3f47241f25a2781d05bb382ea56c1619c3a8aa1103d5
          lemma_keys:
          - de:515ff26864c939eaeafbac15d7bd9c06c5b37883fe6f463151de180eede5cf37
          - de:706bb1bab78fab317b032b37cad4d450dfc3bbedbbf18cacfdcde4279b8391b9
          - fa:8fec9c6c18337670f06ded73ff15b10ab3fef285c7c6c75d8ec337b052c5c59f
          - fa:c3205759bac59bfef15d37995d87d92d87d4bf0975144d5b1133840c83be48fd
      summary: Synthetic fixture data.
    SearchExactAnswer:
      value:
        dataset_version: fixture-v1
        interpreted_query:
          raw: Buch
          detected_lang: de
          normalized: Buch
        limit: 20
        offset: 0
        total: 2
        results:
        - lang: de
          headword: Buch
          match:
            type: exact
            text: Buch
          pos_blocks:
          - pos: noun
            labels: []
            grammar:
              genders:
              - n
              plurals:
              - Bücher
              genitives:
              - Buches
              ipa:
              - buːx
              forms: []
              freq_rank: 1
              articles:
              - das
              number: singular
              plural_status: known
            translations:
            - lang: fa
              text: کتاب
              romanization: ketāb
              vocalization: کِتاب
              senses:
              - de: null
                en: book
                fa: null
              labels: []
              link_type: direct
              score: 0.98
              sources:
              - key: fixture_a
                ref: fixture_a:pair:1
              - key: fixture_b
                ref: fixture_b:pair:book
              target_headword: کتاب
              target_pos: noun
              target_grammar:
                plurals:
                - کتاب‌ها
                ipa: []
                romanizations:
                - ketāb
                vocalizations:
                - کِتاب
                forms: []
                freq_rank: 2
              target_sources: []
          best_translation:
            pos_index: 0
            translation_index: 0
        - lang: de
          headword: Buchhandlung
          match:
            type: prefix
            text: Buchhandlung
          pos_blocks:
          - pos: noun
            labels: []
            grammar:
              genders:
              - f
              plurals:
              - Buchhandlungen
              genitives: []
              ipa: []
              forms: []
              freq_rank: 90
              articles:
              - die
              number: singular
              plural_status: known
            translations:
            - lang: fa
              text: کتاب‌فروشی
              romanization: ketāb-foruši
              vocalization: کِتاب‌فُروشی
              senses:
              - de: null
                en: bookshop
                fa: null
              labels: []
              link_type: direct
              score: 0.98
              sources:
              - key: fixture_b
                ref: fixture_b:pair:47
              target_headword: کتاب‌فروشی
              target_pos: noun
              target_grammar:
                plurals: []
                ipa: []
                romanizations:
                - ketāb-foruši
                vocalizations:
                - کِتاب‌فُروشی
                forms: []
                freq_rank: 91
              target_sources: []
          best_translation:
            pos_index: 0
            translation_index: 0
        suggestions: []
        answer:
          source_lang: de
          source_headword: Buch
          source_pos: noun
          source_grammar:
            genders:
            - n
            plurals:
            - Bücher
            genitives:
            - Buches
            ipa:
            - buːx
            forms: []
            freq_rank: 1
            articles:
            - das
            number: singular
            plural_status: known
          source_sources: []
          match:
            type: exact
            text: Buch
          translation:
            lang: fa
            text: کتاب
            romanization: ketāb
            vocalization: کِتاب
            senses:
            - de: null
              en: book
              fa: null
            labels: []
            link_type: direct
            score: 0.98
            sources:
            - key: fixture_a
              ref: fixture_a:pair:1
            - key: fixture_b
              ref: fixture_b:pair:book
            target_headword: کتاب
            target_pos: noun
            target_grammar:
              plurals:
              - کتاب‌ها
              ipa: []
              romanizations:
              - ketāb
              vocalizations:
              - کِتاب
              forms: []
              freq_rank: 2
            target_sources: []
          more_translations: []
          other_pos: []
        segments:
        - start: 0
          end: 4
          surface: Buch
          kind: word
          keys:
          - lang: de
            key: buch
          matches:
          - lang: de
            headword: Buch
            lemma_key: de:7f1659871c7a9aa9069006e88a83751d50dd14712d60df15e75094cfa98d94b0
            pos: noun
            match:
              type: exact
              text: Buch
            source_keys:
            - fixture_a
            - fixture_b
            answer:
              translation:
                lang: fa
                text: کتاب
                score: 0.98
                romanization: ketāb
                vocalization: کِتاب
                target_headword: کتاب
                target_pos: noun
                sources:
                - key: fixture_a
                - key: fixture_b
              more_translations: []
              other_pos: []
            related_spans: []
        segments_complete: true
        state: full
        partial: null
        correction: null
      summary: Synthetic fixture data.
    SearchMoreTranslations:
      value:
        dataset_version: fixture-v1
        interpreted_query:
          raw: Bank
          detected_lang: de
          normalized: Bank
        limit: 20
        offset: 0
        total: 1
        results:
        - lang: de
          headword: Bank
          match:
            type: exact
            text: Bank
          pos_blocks:
          - pos: noun
            labels: []
            grammar:
              genders:
              - f
              plurals:
              - Banken
              - Bänke
              genitives: []
              ipa: []
              forms: []
              freq_rank: 33
              articles:
              - die
              number: singular
              plural_status: known
            translations:
            - lang: fa
              text: بانک
              romanization: null
              vocalization: null
              senses:
              - de: Geldinstitut
                en: financial institution
                fa: نهاد مالی
              labels:
              - finance
              link_type: direct
              score: 0.98
              sources:
              - key: fixture_b
                ref: fixture_b:pair:17
              target_headword: بانک
              target_pos: noun
              target_grammar:
                plurals: []
                ipa: []
                romanizations: []
                vocalizations: []
                forms: []
                freq_rank: 34
              target_sources: []
            - lang: fa
              text: نیمکت
              romanization: null
              vocalization: null
              senses:
              - de: Sitzgelegenheit
                en: bench
                fa: جای نشستن
              labels:
              - furniture
              link_type: direct
              score: 0.97
              sources:
              - key: fixture_b
                ref: fixture_b:pair:88
              target_headword: نیمکت
              target_pos: noun
              target_grammar:
                plurals: []
                ipa: []
                romanizations: []
                vocalizations: []
                forms: []
                freq_rank: 172
              target_sources: []
          best_translation:
            pos_index: 0
            translation_index: 0
        suggestions: []
        answer:
          source_lang: de
          source_headword: Bank
          source_pos: noun
          source_grammar:
            genders:
            - f
            plurals:
            - Banken
            - Bänke
            genitives: []
            ipa: []
            forms: []
            freq_rank: 33
            articles:
            - die
            number: singular
            plural_status: known
          source_sources: []
          match:
            type: exact
            text: Bank
          translation:
            lang: fa
            text: بانک
            romanization: null
            vocalization: null
            senses:
            - de: Geldinstitut
              en: financial institution
              fa: نهاد مالی
            labels:
            - finance
            link_type: direct
            score: 0.98
            sources:
            - key: fixture_b
              ref: fixture_b:pair:17
            target_headword: بانک
            target_pos: noun
            target_grammar:
              plurals: []
              ipa: []
              romanizations: []
              vocalizations: []
              forms: []
              freq_rank: 34
            target_sources: []
          more_translations:
          - lang: fa
            text: نیمکت
            romanization: null
            vocalization: null
            senses:
            - de: Sitzgelegenheit
              en: bench
              fa: جای نشستن
            labels:
            - furniture
            link_type: direct
            score: 0.97
            sources:
            - key: fixture_b
              ref: fixture_b:pair:88
            target_headword: نیمکت
            target_pos: noun
            target_grammar:
              plurals: []
              ipa: []
              romanizations: []
              vocalizations: []
              forms: []
              freq_rank: 172
            target_sources: []
          other_pos: []
        segments:
        - start: 0
          end: 4
          surface: Bank
          kind: word
          keys:
          - lang: de
            key: bank
          matches:
          - lang: de
            headword: Bank
            lemma_key: de:706bb1bab78fab317b032b37cad4d450dfc3bbedbbf18cacfdcde4279b8391b9
            pos: noun
            match:
              type: exact
              text: Bank
            source_keys:
            - fixture_b
            answer:
              translation:
                lang: fa
                text: بانک
                score: 0.98
                romanization: null
                vocalization: null
                target_headword: بانک
                target_pos: noun
                sources:
                - key: fixture_b
              more_translations:
              - lang: fa
                text: نیمکت
                score: 0.97
                romanization: null
                vocalization: null
                target_headword: نیمکت
                target_pos: noun
                sources:
                - key: fixture_b
              other_pos: []
            related_spans: []
        segments_complete: true
        state: full
        partial: null
        correction: null
      summary: Synthetic fixture data.
    SearchPrefixAnswer:
      value:
        dataset_version: fixture-v1
        interpreted_query:
          raw: کتا
          detected_lang: fa
          normalized: کتا
        limit: 20
        offset: 0
        total: 2
        results:
        - lang: fa
          headword: کتاب
          match:
            type: prefix
            text: کتاب
          pos_blocks:
          - pos: noun
            labels: []
            grammar:
              plurals:
              - کتاب‌ها
              ipa: []
              romanizations:
              - ketāb
              vocalizations:
              - کِتاب
              forms: []
              freq_rank: 2
            translations:
            - lang: de
              text: Buch
              romanization: null
              vocalization: null
              senses:
              - de: null
                en: book
                fa: null
              labels: []
              link_type: direct
              score: 0.98
              sources:
              - key: fixture_a
                ref: fixture_a:pair:1
              - key: fixture_b
                ref: fixture_b:pair:book
              target_headword: Buch
              target_pos: noun
              target_grammar:
                genders:
                - n
                plurals:
                - Bücher
                genitives:
                - Buches
                ipa:
                - buːx
                forms: []
                freq_rank: 1
                articles:
                - das
                number: singular
                plural_status: known
              target_sources: []
          best_translation:
            pos_index: 0
            translation_index: 0
        - lang: fa
          headword: کتاب‌فروشی
          match:
            type: prefix
            text: کتاب‌فروشی
          pos_blocks:
          - pos: noun
            labels: []
            grammar:
              plurals: []
              ipa: []
              romanizations:
              - ketāb-foruši
              vocalizations:
              - کِتاب‌فُروشی
              forms: []
              freq_rank: 91
            translations:
            - lang: de
              text: Buchhandlung
              romanization: null
              vocalization: null
              senses:
              - de: null
                en: bookshop
                fa: null
              labels: []
              link_type: direct
              score: 0.98
              sources:
              - key: fixture_b
                ref: fixture_b:pair:47
              target_headword: Buchhandlung
              target_pos: noun
              target_grammar:
                genders:
                - f
                plurals:
                - Buchhandlungen
                genitives: []
                ipa: []
                forms: []
                freq_rank: 90
                articles:
                - die
                number: singular
                plural_status: known
              target_sources: []
          best_translation:
            pos_index: 0
            translation_index: 0
        suggestions: []
        answer: null
        segments:
        - start: 0
          end: 3
          surface: کتا
          kind: unresolved
          keys:
          - lang: fa
            key: کتا
          matches: []
        segments_complete: true
        state: missing
        partial: null
        correction: null
      summary: Synthetic fixture data.
    SearchOtherPos:
      value:
        dataset_version: fixture-v1
        interpreted_query:
          raw: laut
          detected_lang: de
          normalized: laut
        limit: 20
        offset: 0
        total: 1
        results:
        - lang: de
          headword: laut
          match:
            type: exact
            text: laut
          pos_blocks:
          - pos: adjective
            labels: []
            grammar:
              genders: []
              plurals: []
              genitives: []
              ipa: []
              forms: []
              freq_rank: 146
              articles: []
              number: unknown
              plural_status: unknown
            translations:
            - lang: fa
              text: بلند
              romanization: null
              vocalization: null
              senses:
              - de: null
                en: loud
                fa: null
              labels: []
              link_type: direct
              score: 0.98
              sources:
              - key: fixture_b
                ref: fixture_b:pair:75
              target_headword: بلند
              target_pos: adjective
              target_grammar:
                plurals: []
                ipa: []
                romanizations: []
                vocalizations: []
                forms: []
                freq_rank: 147
              target_sources: []
          - pos: preposition
            labels: []
            grammar:
              genders: []
              plurals: []
              genitives: []
              ipa: []
              forms: []
              freq_rank: 150
              articles: []
              number: unknown
              plural_status: unknown
            translations:
            - lang: fa
              text: طبق
              romanization: tebq
              vocalization: null
              senses:
              - de: gemäß
                en: according to
                fa: بر اساس
              labels: []
              link_type: direct
              score: 0.98
              sources:
              - key: fixture_b
                ref: fixture_b:pair:77
              target_headword: طبق
              target_pos: preposition
              target_grammar:
                plurals: []
                ipa: []
                romanizations:
                - tebq
                vocalizations: []
                forms: []
                freq_rank: 151
              target_sources: []
          best_translation:
            pos_index: 0
            translation_index: 0
        suggestions: []
        answer:
          source_lang: de
          source_headword: laut
          source_pos: adjective
          source_grammar:
            genders: []
            plurals: []
            genitives: []
            ipa: []
            forms: []
            freq_rank: 146
            articles: []
            number: unknown
            plural_status: unknown
          source_sources: []
          match:
            type: exact
            text: laut
          translation:
            lang: fa
            text: بلند
            romanization: null
            vocalization: null
            senses:
            - de: null
              en: loud
              fa: null
            labels: []
            link_type: direct
            score: 0.98
            sources:
            - key: fixture_b
              ref: fixture_b:pair:75
            target_headword: بلند
            target_pos: adjective
            target_grammar:
              plurals: []
              ipa: []
              romanizations: []
              vocalizations: []
              forms: []
              freq_rank: 147
            target_sources: []
          more_translations: []
          other_pos:
          - source_pos: preposition
            translation:
              lang: fa
              text: طبق
              romanization: tebq
              vocalization: null
              senses:
              - de: gemäß
                en: according to
                fa: بر اساس
              labels: []
              link_type: direct
              score: 0.98
              sources:
              - key: fixture_b
                ref: fixture_b:pair:77
              target_headword: طبق
              target_pos: preposition
              target_grammar:
                plurals: []
                ipa: []
                romanizations:
                - tebq
                vocalizations: []
                forms: []
                freq_rank: 151
              target_sources: []
        segments:
        - start: 0
          end: 4
          surface: laut
          kind: word
          keys:
          - lang: de
            key: laut
          matches:
          - lang: de
            headword: laut
            lemma_key: de:67a856303badebc505ab083507e19c53e2142085133f885137b6255d4fca19b7
            pos: adjective
            match:
              type: exact
              text: laut
            source_keys:
            - fixture_b
            answer:
              translation:
                lang: fa
                text: بلند
                score: 0.98
                romanization: null
                vocalization: null
                target_headword: بلند
                target_pos: adjective
                sources:
                - key: fixture_b
              more_translations: []
              other_pos:
              - source_pos: preposition
                translation:
                  lang: fa
                  text: طبق
                  score: 0.98
                  romanization: tebq
                  vocalization: null
                  target_headword: طبق
                  target_pos: preposition
                  sources:
                  - key: fixture_b
            related_spans: []
          - lang: de
            headword: laut
            lemma_key: de:14cf7d811c06d0b36c4d56973e36e9e52204c73f51b14e2456650b40bba62419
            pos: preposition
            match:
              type: exact
              text: laut
            source_keys:
            - fixture_b
            answer:
              translation:
                lang: fa
                text: طبق
                score: 0.98
                romanization: tebq
                vocalization: null
                target_headword: طبق
                target_pos: preposition
                sources:
                - key: fixture_b
              more_translations: []
              other_pos:
              - source_pos: adjective
                translation:
                  lang: fa
                  text: بلند
                  score: 0.98
                  romanization: null
                  vocalization: null
                  target_headword: بلند
                  target_pos: adjective
                  sources:
                  - key: fixture_b
            related_spans: []
        segments_complete: true
        state: full
        partial: null
        correction: null
      summary: Synthetic fixture data.
    SearchLatinMatch:
      value:
        dataset_version: fixture-v1
        interpreted_query:
          raw: ketab
          detected_lang: de
          normalized: ketab
        limit: 20
        offset: 0
        total: 1
        results:
        - lang: fa
          headword: کتاب
          match:
            type: latin
            text: ketāb
          pos_blocks:
          - pos: noun
            labels: []
            grammar:
              plurals:
              - کتاب‌ها
              ipa: []
              romanizations:
              - ketāb
              vocalizations:
              - کِتاب
              forms: []
              freq_rank: 2
            translations:
            - lang: de
              text: Buch
              romanization: null
              vocalization: null
              senses:
              - de: null
                en: book
                fa: null
              labels: []
              link_type: direct
              score: 0.98
              sources:
              - key: fixture_a
                ref: fixture_a:pair:1
              - key: fixture_b
                ref: fixture_b:pair:book
              target_headword: Buch
              target_pos: noun
              target_grammar:
                genders:
                - n
                plurals:
                - Bücher
                genitives:
                - Buches
                ipa:
                - buːx
                forms: []
                freq_rank: 1
                articles:
                - das
                number: singular
                plural_status: known
              target_sources: []
          best_translation:
            pos_index: 0
            translation_index: 0
        suggestions: []
        answer:
          source_lang: fa
          source_headword: کتاب
          source_pos: noun
          source_grammar:
            plurals:
            - کتاب‌ها
            ipa: []
            romanizations:
            - ketāb
            vocalizations:
            - کِتاب
            forms: []
            freq_rank: 2
          source_sources: []
          match:
            type: latin
            text: ketāb
          translation:
            lang: de
            text: Buch
            romanization: null
            vocalization: null
            senses:
            - de: null
              en: book
              fa: null
            labels: []
            link_type: direct
            score: 0.98
            sources:
            - key: fixture_a
              ref: fixture_a:pair:1
            - key: fixture_b
              ref: fixture_b:pair:book
            target_headword: Buch
            target_pos: noun
            target_grammar:
              genders:
              - n
              plurals:
              - Bücher
              genitives:
              - Buches
              ipa:
              - buːx
              forms: []
              freq_rank: 1
              articles:
              - das
              number: singular
              plural_status: known
            target_sources: []
          more_translations: []
          other_pos: []
        segments:
        - start: 0
          end: 5
          surface: ketab
          kind: word
          keys:
          - lang: de
            key: ketab
          matches:
          - lang: fa
            headword: کتاب
            lemma_key: fa:7ac199c11c8739bc5b5e6e011885a19f80002f66357434d2113836ff134c20da
            pos: noun
            match:
              type: latin
              text: ketāb
            source_keys:
            - fixture_a
            - fixture_b
            answer:
              translation:
                lang: de
                text: Buch
                score: 0.98
                romanization: null
                vocalization: null
                target_headword: Buch
                target_pos: noun
                sources:
                - key: fixture_a
                - key: fixture_b
              more_translations: []
              other_pos: []
            related_spans: []
        segments_complete: true
        state: full
        partial: null
        correction: null
      summary: Synthetic fixture data.
    SearchLatinSkeletonMatch:
      value:
        dataset_version: fixture-v1
        interpreted_query:
          raw: ktab
          detected_lang: de
          normalized: ktab
        limit: 20
        offset: 0
        total: 0
        results:
        - lang: fa
          headword: کتاب
          match:
            type: latin_skeleton
            text: کتاب
          pos_blocks:
          - pos: noun
            labels: []
            grammar:
              plurals:
              - کتاب‌ها
              ipa: []
              romanizations:
              - ketāb
              vocalizations:
              - کِتاب
              forms: []
              freq_rank: 2
            translations:
            - lang: de
              text: Buch
              romanization: null
              vocalization: null
              senses:
              - de: null
                en: book
                fa: null
              labels: []
              link_type: direct
              score: 0.98
              sources:
              - key: fixture_a
                ref: fixture_a:pair:1
              - key: fixture_b
                ref: fixture_b:pair:book
              target_headword: Buch
              target_pos: noun
              target_grammar:
                genders:
                - n
                plurals:
                - Bücher
                genitives:
                - Buches
                ipa:
                - buːx
                forms: []
                freq_rank: 1
                articles:
                - das
                number: singular
                plural_status: known
              target_sources: []
          best_translation:
            pos_index: 0
            translation_index: 0
        suggestions: []
        answer: null
        segments:
        - start: 0
          end: 4
          surface: ktab
          kind: unresolved
          keys:
          - lang: de
            key: ktab
          matches: []
        segments_complete: true
        state: missing
        partial: null
        correction: null
      summary: Synthetic fixture data.
    EntryGermanAttestedGrammar:
      value:
        dataset_version: fixture-v1
        lang: de
        headword: aufstehen
        pos_blocks:
        - pos: verb
          labels: []
          grammar:
            genders: []
            plurals: []
            genitives: []
            ipa: []
            forms:
            - form: steht auf
              tags:
              - present
              - third_person
              - singular
              - separable
            - form: stand auf
              tags:
              - past
            - form: aufgestanden
              tags:
              - past_participle
            freq_rank: 122
            infinitives:
            - evidence:
              - annotation: aufstehen
                locator: fixture:aufstehen/aufstehen
                pattern: tagged_form
                pronouns: []
                qualifiers: []
                tags:
                - infinitive
              form: aufstehen
              scope:
                kind: entry
                locator: fixture:aufstehen/entry
                sense_id: null
                source: fixture_a
                source_ref: fixture_a:grammar:aufstehen
              tags:
              - infinitive
            principal_parts:
            - evidence:
              - annotation: steht auf
                locator: fixture:aufstehen/steht auf
                pattern: tagged_form
                pronouns: []
                qualifiers: []
                tags:
                - present
                - indicative
                - singular
                - third-person
              form: steht auf
              role: present
              scope:
                kind: entry
                locator: fixture:aufstehen/entry
                sense_id: null
                source: fixture_a
                source_ref: fixture_a:grammar:aufstehen
              tags:
              - present
              - indicative
              - singular
              - third-person
            - evidence:
              - annotation: stand auf
                locator: fixture:aufstehen/stand auf
                pattern: tagged_form
                pronouns: []
                qualifiers: []
                tags:
                - past
                - indicative
                - singular
                - third-person
              form: stand auf
              role: past
              scope:
                kind: entry
                locator: fixture:aufstehen/entry
                sense_id: null
                source: fixture_a
                source_ref: fixture_a:grammar:aufstehen
              tags:
              - past
              - indicative
              - singular
              - third-person
            - evidence:
              - annotation: aufgestanden
                locator: fixture:aufstehen/aufgestanden
                pattern: tagged_form
                pronouns: []
                qualifiers: []
                tags:
                - past
                - participle
              form: aufgestanden
              role: participle
              scope:
                kind: entry
                locator: fixture:aufstehen/entry
                sense_id: null
                source: fixture_a
                source_ref: fixture_a:grammar:aufstehen
              tags:
              - past
              - participle
            auxiliaries:
            - evidence:
              - annotation: sein
                locator: fixture:aufstehen/sein
                pattern: tagged_form
                pronouns: []
                qualifiers: []
                tags:
                - auxiliary
              scope:
                kind: entry
                locator: fixture:aufstehen/entry
                sense_id: null
                source: fixture_a
                source_ref: fixture_a:grammar:aufstehen
              value: sein
            - evidence:
              - annotation: haben
                locator: fixture:aufstehen/haben
                pattern: tagged_form
                pronouns: []
                qualifiers: []
                tags:
                - auxiliary
              scope:
                kind: entry
                locator: fixture:aufstehen/entry
                sense_id: null
                source: fixture_b
                source_ref: fixture_b:grammar:aufstehen
              value: haben
            reflexivity:
            - evidence:
              - annotation: non-reflexive
                locator: fixture:aufstehen/non-reflexive
                pattern: sense_tag
                pronouns: []
                qualifiers: []
                tags:
                - non-reflexive
              scope:
                kind: sense
                locator: fixture:aufstehen/fixture-standing
                sense_id: fixture-standing
                source: fixture_a
                source_ref: fixture_a:grammar:aufstehen
              value: false
            separability:
            - evidence:
              - annotation: auf.stehen
                locator: fixture:aufstehen/auf.stehen
                pattern: de_conj
                pronouns: []
                qualifiers: []
                tags: []
              scope:
                kind: entry
                locator: fixture:aufstehen/entry
                sense_id: null
                source: fixture_a
                source_ref: fixture_a:grammar:aufstehen
              value: true
            constructions:
            - components:
              - case: dative
                case_annotation: :von(dat)
                gloss: null
                kind: preposition
                optional: null
                preposition: von
                qualifiers: []
              evidence:
              - annotation: :von(dat)
                locator: fixture:aufstehen/:von(dat)
                pattern: plus_obj
                pronouns: []
                qualifiers: []
                tags: []
              scope:
                kind: sense
                locator: fixture:aufstehen/fixture-standing
                sense_id: fixture-standing
                source: fixture_a
                source_ref: fixture_a:grammar:aufstehen
            articles: []
            number: unknown
            plural_status: unknown
          translations:
          - lang: fa
            text: برخاستن
            romanization: null
            vocalization: null
            senses:
            - de: null
              en: get up
              fa: null
            labels: []
            link_type: direct
            score: 0.98
            sources:
            - key: fixture_a
              ref: fixture_a:pair:63
            target_headword: برخاستن
            target_pos: verb
            target_grammar:
              plurals: []
              ipa: []
              romanizations: []
              vocalizations: []
              forms: []
              freq_rank: 123
            target_sources: []
        answer:
          source_lang: de
          source_headword: aufstehen
          source_pos: verb
          source_grammar:
            genders: []
            plurals: []
            genitives: []
            ipa: []
            forms:
            - form: steht auf
              tags:
              - present
              - third_person
              - singular
              - separable
            - form: stand auf
              tags:
              - past
            - form: aufgestanden
              tags:
              - past_participle
            freq_rank: 122
            infinitives:
            - evidence:
              - annotation: aufstehen
                locator: fixture:aufstehen/aufstehen
                pattern: tagged_form
                pronouns: []
                qualifiers: []
                tags:
                - infinitive
              form: aufstehen
              scope:
                kind: entry
                locator: fixture:aufstehen/entry
                sense_id: null
                source: fixture_a
                source_ref: fixture_a:grammar:aufstehen
              tags:
              - infinitive
            principal_parts:
            - evidence:
              - annotation: steht auf
                locator: fixture:aufstehen/steht auf
                pattern: tagged_form
                pronouns: []
                qualifiers: []
                tags:
                - present
                - indicative
                - singular
                - third-person
              form: steht auf
              role: present
              scope:
                kind: entry
                locator: fixture:aufstehen/entry
                sense_id: null
                source: fixture_a
                source_ref: fixture_a:grammar:aufstehen
              tags:
              - present
              - indicative
              - singular
              - third-person
            - evidence:
              - annotation: stand auf
                locator: fixture:aufstehen/stand auf
                pattern: tagged_form
                pronouns: []
                qualifiers: []
                tags:
                - past
                - indicative
                - singular
                - third-person
              form: stand auf
              role: past
              scope:
                kind: entry
                locator: fixture:aufstehen/entry
                sense_id: null
                source: fixture_a
                source_ref: fixture_a:grammar:aufstehen
              tags:
              - past
              - indicative
              - singular
              - third-person
            - evidence:
              - annotation: aufgestanden
                locator: fixture:aufstehen/aufgestanden
                pattern: tagged_form
                pronouns: []
                qualifiers: []
                tags:
                - past
                - participle
              form: aufgestanden
              role: participle
              scope:
                kind: entry
                locator: fixture:aufstehen/entry
                sense_id: null
                source: fixture_a
                source_ref: fixture_a:grammar:aufstehen
              tags:
              - past
              - participle
            auxiliaries:
            - evidence:
              - annotation: sein
                locator: fixture:aufstehen/sein
                pattern: tagged_form
                pronouns: []
                qualifiers: []
                tags:
                - auxiliary
              scope:
                kind: entry
                locator: fixture:aufstehen/entry
                sense_id: null
                source: fixture_a
                source_ref: fixture_a:grammar:aufstehen
              value: sein
            - evidence:
              - annotation: haben
                locator: fixture:aufstehen/haben
                pattern: tagged_form
                pronouns: []
                qualifiers: []
                tags:
                - auxiliary
              scope:
                kind: entry
                locator: fixture:aufstehen/entry
                sense_id: null
                source: fixture_b
                source_ref: fixture_b:grammar:aufstehen
              value: haben
            reflexivity:
            - evidence:
              - annotation: non-reflexive
                locator: fixture:aufstehen/non-reflexive
                pattern: sense_tag
                pronouns: []
                qualifiers: []
                tags:
                - non-reflexive
              scope:
                kind: sense
                locator: fixture:aufstehen/fixture-standing
                sense_id: fixture-standing
                source: fixture_a
                source_ref: fixture_a:grammar:aufstehen
              value: false
            separability:
            - evidence:
              - annotation: auf.stehen
                locator: fixture:aufstehen/auf.stehen
                pattern: de_conj
                pronouns: []
                qualifiers: []
                tags: []
              scope:
                kind: entry
                locator: fixture:aufstehen/entry
                sense_id: null
                source: fixture_a
                source_ref: fixture_a:grammar:aufstehen
              value: true
            constructions:
            - components:
              - case: dative
                case_annotation: :von(dat)
                gloss: null
                kind: preposition
                optional: null
                preposition: von
                qualifiers: []
              evidence:
              - annotation: :von(dat)
                locator: fixture:aufstehen/:von(dat)
                pattern: plus_obj
                pronouns: []
                qualifiers: []
                tags: []
              scope:
                kind: sense
                locator: fixture:aufstehen/fixture-standing
                sense_id: fixture-standing
                source: fixture_a
                source_ref: fixture_a:grammar:aufstehen
            articles: []
            number: unknown
            plural_status: unknown
          source_sources: []
          match:
            type: exact
            text: aufstehen
          translation:
            lang: fa
            text: برخاستن
            romanization: null
            vocalization: null
            senses:
            - de: null
              en: get up
              fa: null
            labels: []
            link_type: direct
            score: 0.98
            sources:
            - key: fixture_a
              ref: fixture_a:pair:63
            target_headword: برخاستن
            target_pos: verb
            target_grammar:
              plurals: []
              ipa: []
              romanizations: []
              vocalizations: []
              forms: []
              freq_rank: 123
            target_sources: []
          more_translations: []
          other_pos: []
        related: []
        related_total: 0
        related_limit: 20
        related_offset: 0
        sentences: []
        sentences_total: 0
        sentences_limit: 10
        sentences_offset: 0
      summary: Synthetic fixture data.
