Для разработчиков
Внешнее API (v1)
CRUD для слов и правил · обновлено 13 сентября 2026
Внешнее API позволяет сервисам читать и изменять данные пользователя
Memo Dict: слова с прогрессом изучения, словари и правила (CRUD для
слов и правил). Токен создаётся в приложении:
Настройки → Аккаунт → API-токен.
Базовый адрес API — https://learn.memo-dict.app
(https://learn.memo-dict.app).
Аутентификация
Токен имеет формат mk_… и показывается один раз —
сохраните его сразу. Перевыпуск токена в настройках отзывает
предыдущий. Токен передаётся в заголовке:
Authorization: Bearer mk_v1StGXR8_Z5jdHi6B-myT
Коды ошибок
| Код | Причина |
|---|---|
| 401 | Токен отсутствует, неверен или отозван |
| 400 | Невалидные параметры запроса |
| 404 | Словарь не найден или принадлежит другому пользователю |
| 429 | Превышен лимит запросов (60/мин на токен) |
Формат ошибки: { "error": "Описание" }.
GET /api/v1/words
Пагинационный список слов пользователя с информацией об изучении, сортировкой и фильтрами.
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
page | int ≥ 1 | 1 | Номер страницы |
limit | 1–100 | 20 | Размер страницы |
dictionaryId | string | — | Фильтр по словарю |
sort |
enum | createdAt |
createdAt · temperature · due · accuracy · random |
order | asc | desc | desc | Направление сортировки |
seed | string ≤ 64 | — | Стабильный порядок для sort=random |
temperature |
enum | — | Фильтр: cold · warm · hot · burning |
due |
enum | — | Фильтр по сроку повтора: overdue · today · later; слова без карточки не матчатся |
inLearningPool | boolean | — | Фильтр по пулу изучения |
accuracyMin / accuracyMax |
int 0–100 | — | Фильтр по точности ответов в % (включительно) |
Сортировка
createdAt— дата добавления слова.temperature— уровень знания по stability FSRS (без карточки —cold).due— срок следующего повторения; слова без карточки идут в конце приasc.accuracy— точность ответов в % (correctCount/reviewCount; без карточки 0%).-
random— случайный порядок. Сseedпорядок стабилен между страницами; безseedсервер генерирует свой и возвращает его в полеseedответа — передавайте его при листании.
Примеры запросов
curl -H "Authorization: Bearer mk_..." \
'https://learn.memo-dict.app/api/v1/words?dictionaryId=d_xyz789&limit=2'
curl -H "Authorization: Bearer mk_..." \
'https://learn.memo-dict.app/api/v1/words?due=overdue&sort=due&order=asc'
Пример ответа
{
"data": [
{
"id": "w_abc123",
"dictionaryId": "d_xyz789",
"sourceText": "hello",
"targetText": "привет",
"pronunciation": "[həˈloʊ]",
"inLearningPool": true,
"learningScore": 3,
"learningCompletedAt": null,
"temperature": "warm",
"reps": 5,
"correctCount": 4,
"incorrectCount": 1,
"lapses": 1,
"createdAt": 1710000000000,
"updatedAt": 1710005000000
}
],
"page": 1,
"limit": 2,
"total": 42,
"totalPages": 21
}
Поля изучения
inLearningPool— слово в текущей группе изучения.learningScore— накопленные баллы (0–5+), ≥ 5 — изучено.-
reps,correctCount,incorrectCount,lapses— счётчики карточки повторения (FSRS); у слова без карточки все нули. -
temperature— уровень знания по stability FSRS (см. таблицу ниже);coldу слов без карточки.
Температура слова
| Stability (дни) | Уровень | Смысл |
|---|---|---|
| < 7 | cold | Только начал учить |
| 7–30 | warm | Неплохо помнит |
| 30–60 | hot | Хорошо закрепилось |
| ≥ 60 | burning | Глубоко выучено |
POST /api/v1/check-words
Проверка наличия слов в словаре: текст токенизируется, каждый токен сравнивается со словами словаря — сначала точное совпадение по нормализованной форме (регистр и пунктуация не учитываются), затем векторное сравнение нераспознанных токенов (до 3 кандидатов со схожестью > 75%). POST используется, так как текст передаётся в теле запроса. Чужой или несуществующий словарь → 404.
curl -X POST -H "Authorization: Bearer mk_..." \
-H "Content-Type: application/json" \
-d '{"dictionaryId": "d_xyz789", "text": "Hello wrold!"}' \
'https://learn.memo-dict.app/api/v1/check-words'
{
"results": [
{
"token": "Hello",
"exact": true,
"matches": [
{
"wordId": "w_abc123",
"sourceText": "hello",
"learning": { "learned": true, "learningScore": 5, "temperature": "warm" }
}
]
},
{
"token": "wrold",
"exact": false,
"matches": [
{
"wordId": "w_def456",
"sourceText": "world",
"similarity": 0.87,
"learning": { "learned": false, "learningScore": 0, "temperature": "cold" }
}
]
}
],
"fuzzyAvailable": true
}
fuzzyAvailable: false — векторное сравнение недоступно,
вернулись только точные совпадения. similarity приходит
только у fuzzy-совпадений. Поле learning показывает
изученность слова словаря: learned — слово пройдено
в Learning v2 (≥ 5 баллов), learningScore — накопленные
баллы, temperature — уровень знания (cold,
если слово не повторялось). Так можно отличить «слово выучено»
от «слово просто есть в словаре».
GET /api/v1/dictionaries
Список словарей пользователя (без удалённых), по возрастанию порядка.
curl -H "Authorization: Bearer mk_..." \
'https://learn.memo-dict.app/api/v1/dictionaries'
{
"data": [
{
"id": "d_xyz789",
"sourceLang": "en",
"targetLang": "ru",
"createdAt": 1710000000000,
"updatedAt": 1710000000000
}
],
"total": 1
}
GET /api/v1/rules
Пагинационный список правил пользователя с сортировкой.
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
page | int ≥ 1 | 1 | Номер страницы |
limit | 1–100 | 20 | Размер страницы |
sort |
enum | updatedAt |
createdAt · updatedAt · random |
order | asc | desc | desc | Направление сортировки |
seed | string ≤ 64 | — | Стабильный порядок для sort=random |
curl -H "Authorization: Bearer mk_..." \
'https://learn.memo-dict.app/api/v1/rules?page=1&limit=20&sort=createdAt&order=asc'
{
"data": [
{
"id": "n_001",
"title": "Präteritum",
"contentMarkdown": "# Präteritum\n...",
"categoryIds": [],
"createdAt": 1710000000000,
"updatedAt": 1710000000000
}
],
"page": 1,
"limit": 20,
"total": 1,
"totalPages": 1
}
GET /api/v1/rules/search
Семантический поиск по правилам пользователя: возвращает ближайшие к
запросу правила по смыслу (векторное сравнение, модель
google/gemini-embedding-2). Ищутся только готовые правила.
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
query | string 1–200 | обязателен | Поисковый запрос |
limit | int 1–100 | 3 | Максимум результатов (топ ближайших) |
В каждом результате — поле score (похожесть 0–1):
> 0.6 — уверенное совпадение; 0.5–0.6 — возможен фоновый шум.
Порог отсечки не применяется — топ возвращается всегда. Если
векторный движок недоступен, вернётся пустой data.
curl -H "Authorization: Bearer mk_..." \
'https://learn.memo-dict.app/api/v1/rules/search?query=прошедшее+время&limit=3'
{
"data": [
{
"id": "n_001",
"title": "Прошедшее время в корейском",
"contentMarkdown": "## Кратко\n...",
"categoryIds": [],
"createdAt": 1710000000000,
"updatedAt": 1710000000000,
"score": 0.72
}
],
"total": 1,
"query": "прошедшее время"
}
POST /api/v1/words
Создание слова в словаре пользователя. Прогресс изучения не задаётся: новые слова создаются «холодными» (без карточки, score 0). Чужой или удалённый словарь → 404.
curl -X POST -H "Authorization: Bearer mk_..." \
-H "Content-Type: application/json" \
-d '{"dictionaryId": "d_xyz789", "sourceText": "hello", "targetText": "привет"}' \
'https://learn.memo-dict.app/api/v1/words'
| Поле | Тип | Описание |
|---|---|---|
dictionaryId | string | Словарь (обязательно) |
sourceText | string ≤ 200 | Слово (обязательно) |
targetText | string ≤ 500 | Перевод (обязательно) |
pronunciation | string ≤ 200 | Транскрипция |
notes | string ≤ 2000 | Заметки |
examples | array ≤ 20 | { "sentence": "…", "translation": "…" } |
tagIds | array ≤ 50 | Идентификаторы тегов |
Ответ — созданное слово (как в списке GET /words, HTTP 201).
GET / PATCH / DELETE /api/v1/words/:id
GET— одно слово с информацией об изучении (404, если не найдено/чужое).-
PATCH— частичное обновление: передайте только изменяемые поля (sourceText,targetText,pronunciation,notes,examples,tagIds, а такжеdictionaryIdдля переноса в другой свой словарь). Прогресс изучения через API не меняется. Ответ — обновлённое слово. -
DELETE— мягкое удаление: слово пропадает из списков и удаляется на всех устройствах пользователя при синхронизации. Ответ:{ "ok": true }.
curl -X PATCH -H "Authorization: Bearer mk_..." \
-H "Content-Type: application/json" \
-d '{"targetText": "привет!"}' \
'https://learn.memo-dict.app/api/v1/words/w_abc123'
POST /api/v1/rules
Создание правила (заметки с kind=rule).
curl -X POST -H "Authorization: Bearer mk_..." \
-H "Content-Type: application/json" \
-d '{"title": "Präteritum", "contentMarkdown": "# Präteritum\n..."}' \
'https://learn.memo-dict.app/api/v1/rules'
| Поле | Тип | Описание |
|---|---|---|
title | string ≤ 140 | Заголовок (обязательно) |
contentMarkdown | string ≤ 100 000 | Markdown (обязательно) |
categoryIds | array ≤ 20 | Категории |
Ответ — созданное правило (как в списке GET /rules, HTTP 201).
GET / PATCH / DELETE /api/v1/rules/:id
GET— одно правило (404, если не найдено/чужое).-
PATCH— частичное обновление:title,contentMarkdown,categoryIds. Ответ — обновлённое правило. -
DELETE— мягкое удаление правила. Ответ:{ "ok": true }.
Все изменения (создание, обновление, удаление) синхронизируются на устройства пользователя автоматически.