Public API v1
The reference of the read-only dictionary API, generated from the OpenAPI document the server publishes — the same contract the SDKs are built from.
Read-only dictionary API under /api/v1 (contract version 1): no authentication, every answer in a { data, meta } envelope, errors as { statusCode, message, error: true }, X-API-Version on every response. Successful GET answers carry ETag, Last-Modified and Cache-Control. Documentation: https://vocab-bloom-hub.com/en/docs/api.
Base URLhttps://<instance>/api/v1Every instance serves the API under its own origin; the examples below use a placeholder.
Endpoints
GET/api/v1/openapi.json
The OpenAPI 3 document of the public API (this contract)
Parameters
No parameters.
Responses
- 200OK —
object - 429Rate limit of the public prefix exceeded (PUBLIC_API_RATE_LIMIT); retry after the window —
PublicApiErrorT - 503Not available: the OpenAPI document is not ready, or the suggestion queue is full —
PublicApiErrorT
Example
curl 'https://your-instance.example/api/v1/openapi.json'
GET/api/v1/search
Search dictionary entries (flat list, no meanings)
Tiers in relevance order: exact, phrasal, starts-with, phrases, ends-with, contains. When none matches, a trigram similarity tier answers typos (`meta.fuzzy: true`, `similarity` on every item; Postgres instances only). A term shorter than 3 characters searches the exact and prefix tiers only (`meta.short_term: true`). Cacheable: the answer carries `ETag`, `Last-Modified` and `Cache-Control` like every public GET.
Parameters
| Name | In | Type | Required | Description |
|---|
search | query | string | yes | The term to search for |
type | query | stringwordgrammar_patternphrase
| no | Restrict the answer to one entry type |
limit | query | integer | no | default: 10 |
Responses
- 200OK —
PublicSearchV1ResT - 400Invalid input: an unknown field, a value outside the allowed set, or a foreign cursor —
PublicApiErrorT - 429Rate limit of the public prefix exceeded (PUBLIC_API_RATE_LIMIT); retry after the window —
PublicApiErrorT
Example
curl 'https://your-instance.example/api/v1/search'
Try it in the playground
GET/api/v1/search/detailed
Search dictionary entries with pagination, meanings and translations
The detailed search: the same term and tiers, paged, with meanings and translations joined on request; the fields travel in the query string (`translation_languages` as a repeated key). Cacheable like every public GET.
Parameters
| Name | In | Type | Required | Description |
|---|
search | query | string | yes | The term to search for |
type | query | stringwordgrammar_patternphrase
| no | Restrict the answer to one entry type |
limit | query | integer | no | default: 10 |
page | query | integer | no | default: 1 |
with_meanings | query | boolean | no | Join the meanings (with translations, synonyms, antonyms) of every item default: false |
with_translations | query | boolean | no | Join the short translations of every item default: false |
translation_languages | query | string[]ruesfrdeptzhar
| no | Keep only these translation languages (a repeated key); omit the key for all of them |
Responses
Example
curl 'https://your-instance.example/api/v1/search/detailed'
Try it in the playground
GET/api/v1/words/{word}
All entries of a headword: parts of speech, forms, meanings, translations, links
Parameters
| Name | In | Type | Required | Description |
|---|
word | path | string | yes | Headword spelling, case-insensitive (spaces URL-encoded for phrases). An inflected form resolves to its base entry |
Responses
Example
curl 'https://your-instance.example/api/v1/words/run'
Try it in the playground
GET/api/v1/words/{word}/meanings
The meanings of a headword across its entries
Parameters
| Name | In | Type | Required | Description |
|---|
word | path | string | yes | Headword spelling, case-insensitive (spaces URL-encoded for phrases). An inflected form resolves to its base entry |
Responses
Example
curl 'https://your-instance.example/api/v1/words/run/meanings'
Try it in the playground
GET/api/v1/words/{word}/translations
The short and per-meaning translations of a headword
Parameters
| Name | In | Type | Required | Description |
|---|
word | path | string | yes | Headword spelling, case-insensitive (spaces URL-encoded for phrases). An inflected form resolves to its base entry |
language | query | string[]ruesfrdeptzhar
| no | Translation languages; no value means all of them |
Responses
Example
curl 'https://your-instance.example/api/v1/words/run/translations'
Try it in the playground
GET/api/v1/words/{word}/synonyms
The synonyms of a headword, per meaning
One item per linked headword and meaning; each names its `meaning_id`, `word_id` and `part_of_speech`.
Parameters
| Name | In | Type | Required | Description |
|---|
word | path | string | yes | Headword spelling, case-insensitive (spaces URL-encoded for phrases). An inflected form resolves to its base entry |
Responses
Example
curl 'https://your-instance.example/api/v1/words/run/synonyms'
Try it in the playground
GET/api/v1/words/{word}/antonyms
The antonyms of a headword, per meaning
One item per linked headword and meaning; each names its `meaning_id`, `word_id` and `part_of_speech`.
Parameters
| Name | In | Type | Required | Description |
|---|
word | path | string | yes | Headword spelling, case-insensitive (spaces URL-encoded for phrases). An inflected form resolves to its base entry |
Responses
Example
curl 'https://your-instance.example/api/v1/words/run/antonyms'
Try it in the playground
GET/api/v1/words/id/{id}
One dictionary entry by its numeric id
Parameters
| Name | In | Type | Required | Description |
|---|
id | path | number | yes | |
Responses
Example
curl 'https://your-instance.example/api/v1/words/id/1'
Try it in the playground
GET/api/v1/words
List dictionary entries by filters, cursor-paged and ordered by (word, id)
Every enum filter accepts a repeated key; values of one filter are OR-ed, filters are AND-ed. `search` keeps the headwords starting with the prefix (an autocomplete or an A–Z browser: cacheable, unlike the search). Pass `meta.next_cursor` back as `cursor` to read the next page.
Parameters
| Name | In | Type | Required | Description |
|---|
search | query | string | no | Headword prefix, case-insensitive (`ru` lists run, rung, runner, …) |
is_obsolete | query | boolean | no | true: obsolete entries only, false: current ones only |
part_of_speech | query | string[]nounverbmodal_verbadjectiveadverbpronounnumeralnumeral_fractionaldeterminerinterjectionarticleprepositionconjunctionletterphrasegrammar_pattern
| no | |
word_level | query | string[]A1A2B1B2C1C2
| no | |
language_register | query | string[]formalinformalslang
| no | |
category | query | string[]scientifictechnicalmedicallegalbusinessITartpoliticalsportculinary
| no | Words tagged with any of the categories |
area_variant | query | string[]commonbritishamericanaustralian
| no | |
form_of_word | query | string[]base_formplural_formpossessive_singular_formpossessive_plural_formpast_simplepast_participlepresent_participlethird_person_singularcomparative_formsuperlative_formobjectpossessive_adjectivepossessive_pronounreflexiveordinalmultiplicative
| no | Defaults to base forms only default: ["base_form"] |
cursor | query | string | no | The `meta.next_cursor` of the previous page; omit for the first page |
limit | query | integer | no | default: 20 |
with_meanings | query | boolean | no | Join the meanings of every word default: false |
with_translations | query | boolean | no | Join the short translations of every word default: false |
Responses
- 200OK —
PublicWordsV1ResT - 400Invalid input: an unknown field, a value outside the allowed set, or a foreign cursor —
PublicApiErrorT - 429Rate limit of the public prefix exceeded (PUBLIC_API_RATE_LIMIT); retry after the window —
PublicApiErrorT
Example
curl 'https://your-instance.example/api/v1/words'
Try it in the playground
GET/api/v1/random
A random dictionary entry matching the filters (base forms unless form_of_word is given)
Parameters
| Name | In | Type | Required | Description |
|---|
search | query | string | no | Headword prefix, case-insensitive (`ru` lists run, rung, runner, …) |
is_obsolete | query | boolean | no | true: obsolete entries only, false: current ones only |
part_of_speech | query | string[]nounverbmodal_verbadjectiveadverbpronounnumeralnumeral_fractionaldeterminerinterjectionarticleprepositionconjunctionletterphrasegrammar_pattern
| no | |
word_level | query | string[]A1A2B1B2C1C2
| no | |
language_register | query | string[]formalinformalslang
| no | |
category | query | string[]scientifictechnicalmedicallegalbusinessITartpoliticalsportculinary
| no | Words tagged with any of the categories |
area_variant | query | string[]commonbritishamericanaustralian
| no | |
form_of_word | query | string[]base_formplural_formpossessive_singular_formpossessive_plural_formpast_simplepast_participlepresent_participlethird_person_singularcomparative_formsuperlative_formobjectpossessive_adjectivepossessive_pronounreflexiveordinalmultiplicative
| no | Defaults to base forms only default: ["base_form"] |
Responses
Example
curl 'https://your-instance.example/api/v1/random'
Try it in the playground
POST/api/v1/words/batch
Up to 50 headwords in one request
Every spelling is matched like `GET /words/{word}`; the answer keeps the request order, collapses duplicates, and lists the spellings without an entry under `meta.not_found` instead of failing. One request against the rate limit, whatever the size of the batch.
| Name | Type | Required | Description |
|---|
words | string[] | yes | Headword spellings, 50 at most, each matched like GET /words/{word} (case-insensitively; an inflected form resolves to its base entry) |
Responses
Example
curl -X POST 'https://your-instance.example/api/v1/words/batch' \
-H 'Content-Type: application/json' \
-d '{"words":["example"]}'Try it in the playground
POST/api/v1/suggestions
Report a mistake in the dictionary data
Files a report for the instance admin to review: what is wrong with a headword (optionally one specific entry of it) and, ideally, what would be right. The headword must exist in the dictionary. Strictly rate-limited; once too many reports are waiting for the admin the endpoint answers 503 until the queue is worked down.
| Name | Type | Required | Description |
|---|
headword | string | yes | The headword the report is about; must exist in the dictionary |
word_id | object | no | Id of the entry (part of speech) the report points at, from the word answers |
kind | stringreportedit
| no | default: "report" |
message | object | no | What is wrong and, ideally, what would be right. Required for a report; an optional comment on an edit |
edits | SuggestionEditV1DTO[] | no | Edit flow: every touched target of the word form with its proposed values |
Responses
Example
curl -X POST 'https://your-instance.example/api/v1/suggestions' \
-H 'Content-Type: application/json' \
-d '{"headword":"example"}'Try it in the playground
Schemas
SuggestionEditV1DTO
| Name | Type | Required | Description |
|---|
target_type | stringwordmeaningmeaning_translationshort_translation
| yes | |
target_id | number | yes | Id of the targeted row, from the word answers |
changes | object | yes | The proposed field values, e.g. { "definition": "…" }. The accepted fields depend on target_type; unknown fields, empty values and values equal to the current ones are rejected |
CreateSuggestionV1ReqDTO
| Name | Type | Required | Description |
|---|
headword | string | yes | The headword the report is about; must exist in the dictionary |
word_id | object | no | Id of the entry (part of speech) the report points at, from the word answers |
kind | stringreportedit
| no | default: "report" |
message | object | no | What is wrong and, ideally, what would be right. Required for a report; an optional comment on an edit |
edits | SuggestionEditV1DTO[] | no | Edit flow: every touched target of the word form with its proposed values |
WordsBatchV1ReqDTO
| Name | Type | Required | Description |
|---|
words | string[] | yes | Headword spellings, 50 at most, each matched like GET /words/{word} (case-insensitively; an inflected form resolves to its base entry) |
EnPartOfSpeechE
One of: noun, verb, modal_verb, adjective, adverb, pronoun, numeral, numeral_fractional, determiner, interjection, article, preposition, conjunction, letter, phrase, grammar_pattern
WordLevelE
One of: A1, A2, B1, B2, C1, C2
EnAreaVariantsE
One of: common, british, american, australian
CategoryE
One of: scientific, technical, medical, legal, business, IT, art, political, sport, culinary
LanguageRegisterE
One of: formal, informal, slang
EnVerbTransitivityE
One of: transitive, intransitive, both
EnPhrasalObjectPatternE
One of: no_object, inseparable, separable, separable_pronoun_only
PublicSearchDetailedV1ResT
PublicWordV1MeaningTranslationT
AvailableTranslationLanguagesE
One of: ru, es, fr, de, pt, zh, ar
PublicWordV1ShortTranslationT
PublicHeadwordMeaningsV1ResT
PublicShortTranslationV1T
PublicMeaningTranslationV1T
PublicWordLinkV1T
| Name | Type | Required | Description |
|---|
meaning_id | integer | yes | |
word | string | yes | |
word_id | integer | yes | |
part_of_speech | EnPartOfSpeechE | yes | |
PublicHeadwordLinksV1ResT
PublicHeadwordTranslationsV1T
PublicHeadwordTranslationsV1ResT
PublicWordsBatchItemV1T
| Name | Type | Required | Description |
|---|
word | string | yes | |
count | integer | yes | |
entries | PublicWordV1T[] | yes | |
PublicDatasetCountsV1T
| Name | Type | Required | Description |
|---|
entries | integer | yes | |
words | integer | yes | |
phrases | integer | yes | |
grammar_patterns | integer | yes | |
word_forms | integer | yes | |
meanings | integer | yes | |
meaning_translations | integer | yes | |
short_translations | integer | yes | |
PublicAvailableLanguagesV1T
PublicSuggestionCreatedV1T
| Name | Type | Required | Description |
|---|
id | integer | yes | |
status | string | yes | |
PublicSuggestionCreatedV1ResT
PublicApiErrorT
| Name | Type | Required | Description |
|---|
statusCode | number | yes | |
message | string | yes | |
error | boolean | yes | |