Free API for conjugating Russian verbs in all tenses (present, past, future)
Project description
ru-api-free
Free REST API for Russian morphology: verb conjugation, noun pluralisation, noun case declension, and adjective declension. Translate words from any language to Russian — if it's a verb, you get full conjugation.
Live API: https://ru-api-free.onrender.com
Website frontend: https://ru-api-free.onrender.com/site
PyPI package: ru-api-free
GitHub repo: faharht1/ru-api-free
Quick Start
# Translate + conjugate any verb
curl "https://ru-api-free.onrender.com/translate?text=speak"
# Pluralise a noun
curl "https://ru-api-free.onrender.com/pluralise?text=house"
# Decline a noun (all 6 cases × 2 numbers)
curl "https://ru-api-free.onrender.com/decline?text=book"
# Decline an adjective (all genders × 6 cases)
curl "https://ru-api-free.onrender.com/decline-adjective?text=new"
const res = await fetch("https://ru-api-free.onrender.com/translate?text=speak");
const data = await res.json();
console.log(data.verb, data.tenses.present["я"]); // "говорить говорю"
import requests
r = requests.get("https://ru-api-free.onrender.com/translate", params={"text": "speak"})
print(r.json()["tenses"]["present"]["я"]) # "говорю"
API Endpoints
Endpoint overview
| Endpoint | Description |
|---|---|
GET /translate |
Translate any word; if it's a verb, conjugate it |
GET /conjugate |
Conjugate a Russian verb directly |
GET /verbs |
List all supported Russian verbs |
GET /search |
Search verbs by substring |
GET /exceptions |
List all conjugation exceptions |
GET /exceptions/{verb} |
Get exceptions for a specific verb |
GET /pluralise |
Pluralise a noun |
GET /decline |
Decline a noun (6 cases × singular/plural) |
GET /decline-adjective |
Decline an adjective (2 genders × 6 cases + plural) |
GET /site |
Interactive web UI |
1. Translate + Conjugate
GET /translate?text={word}&source=auto&target=ru
| Param | Default | Description |
|---|---|---|
text |
— | Word to translate (required) |
source |
auto |
Source language code |
target |
ru |
Target language code |
Behaviour:
- If the translated word is a known Russian verb → returns full conjugation table
- If it's a noun / other → returns just the translation
- Supports any language via auto-detect
Examples:
# English verb → conjugation
curl "https://ru-api-free.onrender.com/translate?text=speak"
# German verb → conjugation
curl "https://ru-api-free.onrender.com/translate?text=sprechen&source=de"
# French verb → conjugation
curl "https://ru-api-free.onrender.com/translate?text=lire&source=fr"
# Spanish verb → conjugation
curl "https://ru-api-free.onrender.com/translate?text=hablar&source=es"
# Noun → translation only
curl "https://ru-api-free.onrender.com/translate?text=house"
# Russian → English
curl "https://ru-api-free.onrender.com/translate?text=читать&source=ru&target=en"
# Polish word → translation
curl "https://ru-api-free.onrender.com/translate?text=pić&source=pl"
Response (verb):
{
"verb": "говорить",
"aspect": "imperfective",
"conjugation_type": 2,
"reflexive": false,
"tenses": {
"present": { "я": "говорю", "ты": "говоришь", "он/она/оно": "говорит", "мы": "говорим", "вы": "говорите", "они": "говорят" },
"past": { "мужской": "говорил", "женский": "говорила", "средний": "говорило", "множественное": "говорили" },
"future": { "я": "буду говорить", "ты": "будешь говорить", "он/она/оно": "будет говорить", "мы": "будем говорить", "вы": "будете говорить", "они": "будут говорить" }
},
"original": "speak",
"translated": "говорить",
"source_lang": "en"
}
Response (noun):
{
"original": "house",
"translated": "дом",
"source_lang": "en",
"note": "дом is not a verb in our dictionary"
}
2. Direct Conjugation
GET /conjugate?verb={verb}
Conjugate a Russian verb directly without translation.
| Param | Description |
|---|---|
verb |
Russian infinitive (required) |
curl "https://ru-api-free.onrender.com/conjugate?verb=читать"
curl "https://ru-api-free.onrender.com/conjugate?verb=говорить"
curl "https://ru-api-free.onrender.com/conjugate?verb=мыть"
Returns the same response format as /translate but without original, translated, or source_lang fields.
3. List all verbs
GET /verbs
Returns a JSON object with all supported Russian verbs grouped by conjugation type.
curl "https://ru-api-free.onrender.com/verbs"
4. Search verbs
GET /search?q={query}
Search the verb dictionary by substring.
| Param | Description |
|---|---|
q |
Search query (required) |
curl "https://ru-api-free.onrender.com/search?q=чит"
curl "https://ru-api-free.onrender.com/search?q=гов"
Returns matching verbs with conjugation type, stem, and endings.
5. Pluralise (nouns)
GET /pluralise?text={word}&source=auto
Translate any word to Russian and get its plural form. Handles 150+ irregular plurals.
| Param | Default | Description |
|---|---|---|
text |
— | Word to pluralise (required) |
source |
auto |
Source language code |
curl "https://ru-api-free.onrender.com/pluralise?text=house"
curl "https://ru-api-free.onrender.com/pluralise?text=Haus&source=de"
curl "https://ru-api-free.onrender.com/pluralise?text=дом"
curl "https://ru-api-free.onrender.com/pluralise?text=книга"
curl "https://ru-api-free.onrender.com/pluralise?text=окно"
Response:
{
"singular": "дом",
"plural": "дома",
"gender": "masculine",
"original": "house",
"translated": "дом",
"source_lang": "en"
}
Irregulars covered: человек → люди, ребёнок → дети, друг → друзья, сын → сыновья, брат → братья, муж → мужья, дерево → деревья, лист → листья, стул → стулья, платье → платья, крыло → крылья, перо → перья, ухо → уши, плечо → плечи, колено → колени, яблоко → яблоки, облако → облака, море → моря, поле → поля, сердце → сердца, апельсин → апельсины, помидор → помидоры, сосед → соседи, чертёнок → чертенята, иностранец → иностранцы, славянин → славяне, римлянин → римляне, цыган → цыгане, господин → господа, хозяин → хозяева, шурин → шурья, кум → кумовья, князь → князья — and 120+ more.
6. Decline (noun cases)
GET /decline?text={word}&source=auto&animate=false
Translate any word to Russian and get all 6 noun cases in singular and plural.
| Param | Default | Description |
|---|---|---|
text |
— | Word to decline (required) |
source |
auto |
Source language code |
animate |
false |
If true, accusative = genitive for masculine animate nouns |
curl "https://ru-api-free.onrender.com/decline?text=house"
curl "https://ru-api-free.onrender.com/decline?text=дом"
curl "https://ru-api-free.onrender.com/decline?text=книга"
curl "https://ru-api-free.onrender.com/decline?text=море"
curl "https://ru-api-free.onrender.com/decline?text=мать"
curl "https://ru-api-free.onrender.com/decline?text=ими"
curl "https://ru-api-free.onrender.com/decline?text=Haus&source=de"
Response:
{
"word": "дом",
"gender": "masculine",
"declension": "first",
"singular": {
"nominative": "дом",
"genitive": "дома",
"dative": "дому",
"accusative": "дом",
"instrumental": "домом",
"prepositional": "доме"
},
"plural": {
"nominative": "дома",
"genitive": "домов",
"dative": "домам",
"accusative": "дома",
"instrumental": "домами",
"prepositional": "домах"
},
"original": "house",
"translated": "дом",
"source_lang": "en"
}
Special nouns handled: путь, дитя, мать, дочь, время, имя, бремя, вымя, знамя, пламя, племя, семя, стремя, темя, and other -мя neuters. Also handles feminine nouns ending in -ь (мышь, дверь, площадь, любовь, etc.).
7. Decline Adjective
GET /decline-adjective?text={adj}&source=auto&animate=false
Decline a Russian adjective in all genders and cases. Enter the masculine nominative form.
| Param | Default | Description |
|---|---|---|
text |
— | Adjective to decline (required) |
source |
auto |
Source language code |
animate |
false |
If true, accusative = genitive for masculine and plural |
curl "https://ru-api-free.onrender.com/decline-adjective?text=new"
curl "https://ru-api-free.onrender.com/decline-adjective?text=новый"
curl "https://ru-api-free.onrender.com/decline-adjective?text=neu&source=de"
curl "https://ru-api-free.onrender.com/decline-adjective?text=синий"
curl "https://ru-api-free.onrender.com/decline-adjective?text=хороший"
curl "https://ru-api-free.onrender.com/decline-adjective?text=большой"
curl "https://ru-api-free.onrender.com/decline-adjective?text=маленький"
Response:
{
"adjective": "новый",
"type": "hard",
"forms": {
"masculine": {
"nominative": "новый",
"genitive": "нового",
"dative": "новому",
"accusative": "новый",
"instrumental": "новым",
"prepositional": "новом"
},
"feminine": {
"nominative": "новая",
"genitive": "новой",
"dative": "новой",
"accusative": "новую",
"instrumental": "новой",
"prepositional": "новой"
},
"neuter": {
"nominative": "новое",
"genitive": "нового",
"dative": "новому",
"accusative": "новое",
"instrumental": "новым",
"prepositional": "новом"
},
"plural": {
"nominative": "новые",
"genitive": "новых",
"dative": "новым",
"accusative": "новые",
"instrumental": "новыми",
"prepositional": "новых"
}
},
"original": "new",
"translated": "новый",
"source_lang": "en"
}
Adjective types supported:
| Type | Ending | Examples |
|---|---|---|
hard |
-ый | новый, белый, старый, красный |
hard_stressed |
-ой (non-sibilant) | прямой, простой, рябой |
soft |
-ий (after soft consonant) | синий, древний, летний |
sibilant |
-ий (after ш, ж, ч, щ) | хороший, свежий, горячий |
sibilant_stressed |
-ой (after sibilant) | большой, чужой |
velar |
-ий (after г, к, х) | маленький, русский, великий |
8. Exceptions
GET /exceptions
GET /exceptions/{verb}
List all conjugation exceptions, or get detailed exception info for a specific verb.
curl "https://ru-api-free.onrender.com/exceptions"
curl "https://ru-api-free.onrender.com/exceptions/брить"
curl "https://ru-api-free.onrender.com/exceptions/гнать"
Exception types returned:
стиverbs (нести, вести, etc.)чьverbs (мочь, печь, etc.)- 1st-conjugation
итьverbs (брить, стелить) - 2nd-conjugation
ать/ять/етьverbs (гнать, держать, слышать, etc.) овать→уюverbs (требовать, рисовать)нутьverbs (гибнуть, мёрзнуть)еретьverbs (тереть, умереть)олать→олюverbs (колоть, полоть)овать→уюwith consonant mutationзти→ззуverbs (везти, лезть)сти→слуverbs (расти, цвести)сти→сдуverbs (блясти, чести)еречь→регуverbs (беречь, стеречь)ивать→уюverbs- Miscellaneous (ехать, дать, есть)
9. Interactive Web UI
GET /site
Opens a full-featured web interface with tabs for Conjugate, Pluralise, Decline, and Decline Adj modes. Includes a language selector dropdown for source language.
https://ru-api-free.onrender.com/site
Python Library (no server needed)
Install the package and use it directly:
pip install ru-api-free
from ru_api_free import (
conjugate, search_verbs, list_verbs,
translate, translate_en_to_ru,
pluralise, pluralise_with_info,
decline, decline_with_info,
decline_adjective, decline_adjective_with_info,
get_exceptions, get_verb_exceptions, EXCEPTION_TYPES,
)
Conjugation
result, status = conjugate("читать")
print(result["tenses"]["present"]["я"]) # читаю
print(result["tenses"]["past"]["женский"]) # читала
print(result["tenses"]["future"]["мы"]) # будем читать
Translation
russian = translate("speak", source="auto", target="ru")
print(russian) # говорить
# Also returns Russian from English directly
eng = translate_en_to_ru("house")
print(eng) # дом
Pluralise
info = pluralise("дом")
print(info["singular"], "→", info["plural"]) # "дом → дома"
# With metadata
info2 = pluralise_with_info("книга")
print(info2["gender"]) # feminine
print(info2["plural"]) # книги
print(info2["singular"]) # книга
Noun Declension
cases = decline("дом")
print(cases["singular"]["genitive"]) # дома
print(cases["plural"]["dative"]) # домам
# With metadata
cases2 = decline_with_info("книга")
print(cases2["gender"]) # feminine
print(cases2["declension"]) # second
print(cases2["plural"]["accusative"]) # книги
Adjective Declension
adj = decline_adjective("новый")
print(adj["masculine"]["instrumental"]) # новым
print(adj["feminine"]["accusative"]) # новую
print(adj["plural"]["prepositional"]) # новых
# With type info
adj2 = decline_adjective_with_info("хороший")
print(adj2["type"]) # sibilant
print(adj2["forms"]["feminine"]["genitive"]) # хорошей
Search & List
verbs = list_verbs() # all verbs by conjugation type
results = search_verbs("чит")
print(results) # matching verbs
Exceptions
all_exceptions = get_exceptions()
print(all_exceptions.keys()) # exception type names
verb_ex = get_verb_exceptions("брить")
print(verb_ex)
Self-Hosting
Option 1: pip install
pip install ru-api-free
ru-api-free
# Server starts at http://0.0.0.0:8000
Option 2: Direct uvicorn
pip install ru-api-free uvicorn
python -m uvicorn ru_api_free.main:app --host 127.0.0.1 --port 5000
Option 3: Render deployment
- Fork the repo:
https://github.com/faharht1/ru-api-free - Connect to Render as a Web Service
- Start command:
uvicorn ru_api_free.main:app --host 0.0.0.0 --port $PORT - Deploy
CORS is enabled for all origins — use it directly from any website.
Language Codes
auto - Auto-detect
en - English
ru - Russian
de - German
fr - French
es - Spanish
it - Italian
pt - Portuguese
nl - Dutch
pl - Polish
uk - Ukrainian
be - Belarusian
bg - Bulgarian
cs - Czech
sk - Slovak
sr - Serbian
hr - Croatian
tr - Turkish
ar - Arabic
zh - Chinese
ja - Japanese
ko - Korean
Pass source=pl for Polish words, source=de for German words, etc.
CLI Usage
When installed via pip, the ru-api-free command starts the server:
ru-api-free
# Running on http://0.0.0.0:8000
Or use --port to change the port (check ru-api-free --help for options).
CORS is enabled for all origins.
Local Development
git clone https://github.com/faharht1/ru-api-free.git
cd ru-api-free
# Install in editable mode
pip install -e .
# Start dev server
python -m uvicorn ru_api_free.main:app --host 127.0.0.1 --port 5000 --reload
# Open http://127.0.0.1:5000/site
Response Format Summary
All endpoints return JSON. Common fields:
| Field | Description |
|---|---|
original |
The original input word (if applicable) |
translated |
The Russian translation (if applicable) |
source_lang |
Detected or provided source language |
note / message |
Error or informational message |
tenses |
Verb conjugation table (present / past / future) |
singular / plural |
Noun case tables (decline) or plural (pluralise) |
masculine / feminine / neuter / plural |
Adjective case tables |
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ru_api_free-1.5.1.tar.gz.
File metadata
- Download URL: ru_api_free-1.5.1.tar.gz
- Upload date:
- Size: 39.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
87828783b2a8154ceb3d9795f21348beb8ec93f39c24effa3abef42e1368795f
|
|
| MD5 |
6c007c9cba48d0cdb66bf6270c4ee112
|
|
| BLAKE2b-256 |
d2e6d4f786989ee531041e65edeaa8a77261d60efc675e8f50616a073c482edf
|
File details
Details for the file ru_api_free-1.5.1-py3-none-any.whl.
File metadata
- Download URL: ru_api_free-1.5.1-py3-none-any.whl
- Upload date:
- Size: 34.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7701b8ea84908f08e5b0d8e85e7b10416fedd3b5144481f9d220662b304583bf
|
|
| MD5 |
1ec6e52d0566314806d808d37d54420c
|
|
| BLAKE2b-256 |
a1382399a62268e3c731149af6d05adbd01f6998ba09c640d6eadd7850cd6de6
|