API документация

REST API для управления карточками, заметками и категориями из любого приложения

Аутентификация

Все запросы к /api/v1/* требуют API-ключ. Получить его можно в личном кабинете → раздел «API ключи».

Ключ передаётся в заголовке Authorization:

Authorization: Bearer npk_ваш_ключ_здесь
⚠️ Ключ отображается только один раз при создании. Сохраните его сразу. Максимум 5 ключей на аккаунт.
ℹ️ Ключи не имеют срока действия, но могут быть отозваны вручную в любой момент.

Base URL

https://na-potom.ru/api/v1

Все запросы и ответы используют Content-Type: application/json.

Ошибки

При ошибке сервер возвращает JSON с полем detail:

{
  "detail": "Card not found"
}
КодПричина
401 Ключ не передан, неверный или отозван
404 Ресурс не найден или не принадлежит вам
422 Ошибка валидации тела запроса
429 Превышен лимит заметок в очереди
500 Внутренняя ошибка сервера

Ограничения

  • Максимум 10 заметок одновременно в очереди на обработку
  • Максимальный размер контента заметки: 50 000 символов
  • Список карточек: максимум 100 за один запрос (limit)

Заметки

Заметка — это сырой контент (текст, ссылка, идея), который AI обрабатывает и превращает в карточку. После отправки заметки нужно отдельно опросить статус.

POST /api/v1/notes Добавить заметку в очередь

Тело запроса

ПолеТипОбязательноОписание
content string да Текст, ссылка или произвольный контент. 1–50 000 символов.

Ответ 202 Accepted

{
  "task_id": 42,
  "status": "queued",
  "queue_position": 1
}

После получения task_id отследите результат через GET /api/v1/notes/{task_id}/status.

GET /api/v1/notes/{task_id}/status Статус обработки заметки

Path параметры

ПараметрТипОписание
task_idintegerID задачи из ответа POST /notes

Ответ 200 OK

{
  "id": 42,
  "status": "done",
  "queue_position": 0,
  "result_card_id": 17,
  "pipeline_stage": "done",
  "moderation_failed": false,
  "moderation_reason": "",
  "result_action": "created_new",
  "result_message": "Создана новая карточка «FastAPI»."
}

Возможные значения status

ЗначениеОписание
queuedОжидает обработки
processingОбрабатывается прямо сейчас
doneКарточка создана, result_card_id содержит ID
failedОшибка обработки
moderation_failedКонтент не прошёл модерацию

Карточки

Карточка — результат обработки заметки: заголовок, AI-описание, категория, теги, ссылка.

GET /api/v1/cards Список карточек

Query параметры

ПараметрТипПо умолчаниюОписание
limitinteger20Кол-во результатов (макс. 100)
offsetinteger0Смещение для пагинации
qstringПоисковый запрос
category_slugstringSlug категории (например development-backend)
tagsstringТеги через запятую: ai,python

Ответ 200 OK — массив карточек:

[
  {
    "id": 17,
    "title": "FastAPI",
    "summary": "Современный высокопроизводительный веб-фреймворк...",
    "url": "https://github.com/fastapi/fastapi",
    "original_content": "https://github.com/fastapi/fastapi",
    "is_public": true,
    "created_at": "2026-04-17T05:14:07.746956",
    "updated_at": "2026-04-17T05:14:07.746962",
    "category_name": "Разработка / Backend",
    "category_slug": "development-backend",
    "category_color": "#10b981",
    "tags": ["developer-tools", "open-source"]
  }
]
GET /api/v1/cards/{card_id} Одна карточка

Возвращает карточку с дополнительным полем user_id. Чужие карточки возвращают 404.

Ответ 200 OK — объект карточки (см. выше).

PATCH /api/v1/cards/{card_id}/visibility Публичность карточки

Тело запроса

ПолеТипОписание
is_publicbooleantrue — показать в публичном каталоге, false — скрыть

Ответ 200 OK

{ "card_id": 17, "is_public": true }
DELETE /api/v1/cards/{card_id} Удалить карточку

Soft-delete: карточка помечается как удалённая и пропадает из всех списков. Операция необратима через API.

Ответ 200 OK

{ "card_id": 17, "deleted": true }

Категории

GET /api/v1/categories Список категорий с количеством карточек

Ответ 200 OK

[
  {
    "id": 3,
    "name": "Разработка / Backend",
    "slug": "development-backend",
    "color": "#10b981",
    "card_count": 12
  }
]

Теги

GET /api/v1/tags Теги пользователя с количеством карточек

Ответ 200 OK

[
  { "name": "python",         "count": 8 },
  { "name": "developer-tools","count": 5 },
  { "name": "open-source",    "count": 3 }
]

Статистика

GET /api/v1/stats Сводка по аккаунту

Ответ 200 OK

{
  "total_cards": 42,
  "public_cards": 18,
  "private_cards": 24,
  "categories_count": 7
}

Примеры — cURL

Замените npk_ваш_ключ на свой API-ключ из личного кабинета.

Добавить ссылку в каталог

curl -X POST https://na-potom.ru/api/v1/notes \
  -H "Authorization: Bearer npk_ваш_ключ" \
  -H "Content-Type: application/json" \
  -d '{"content": "https://example.com/article"}'

Проверить статус задачи

curl https://na-potom.ru/api/v1/notes/42/status \
  -H "Authorization: Bearer npk_ваш_ключ"

Получить список карточек с фильтром

curl "https://na-potom.ru/api/v1/cards?limit=10&tags=python,ai" \
  -H "Authorization: Bearer npk_ваш_ключ"

Опубликовать карточку

curl -X PATCH https://na-potom.ru/api/v1/cards/17/visibility \
  -H "Authorization: Bearer npk_ваш_ключ" \
  -H "Content-Type: application/json" \
  -d '{"is_public": true}'

Примеры — Python

import requests
import time

API_KEY = "npk_ваш_ключ"
BASE = "https://na-potom.ru/api/v1"
HEADERS = {"Authorization": f"Bearer {API_KEY}"}

def add_note(content: str) -> int:
    """Добавить заметку и вернуть ID карточки после обработки."""
    resp = requests.post(f"{BASE}/notes",
                         json={"content": content},
                         headers=HEADERS)
    resp.raise_for_status()
    task_id = resp.json()["task_id"]

    # Ждём пока AI обработает
    for _ in range(30):
        time.sleep(5)
        status = requests.get(f"{BASE}/notes/{task_id}/status",
                              headers=HEADERS).json()
        if status["status"] == "done":
            return status["result_card_id"]
        if status["status"] in ("failed", "moderation_failed"):
            raise RuntimeError(status.get("result_message"))

    raise TimeoutError("Обработка заняла слишком много времени")

card_id = add_note("https://github.com/fastapi/fastapi")
print(f"Карточка создана: {card_id}")

# Получить список всех карточек
cards = requests.get(f"{BASE}/cards", headers=HEADERS).json()
for c in cards:
    print(c["title"], c["category_name"])

Примеры — iOS Shortcuts

Создайте шорткат «Поделиться в NaPotom» для добавления ссылок прямо из браузера:

  1. Создайте новый шорткат в приложении «Команды»
  2. Добавьте действие «Получить URL из ввода»
  3. Добавьте действие «Получить содержимое URL» с настройками:
    • URL: https://na-potom.ru/api/v1/notes
    • Метод: POST
    • Заголовки: Authorization: Bearer npk_ваш_ключ
    • Тело (JSON): {"content": "[URL из шага 1]"}
  4. Добавьте действие «Уведомление» с текстом «Добавлено в NaPotom»
  5. В настройках шортката включите «Показывать в меню Поделиться»

После этого на любой странице Safari нажмите «Поделиться» → найдите ваш шорткат — ссылка уйдёт в обработку.