База знаний

Plaud — неофициальный личный API: практическое руководство

Как программно получить свои записи, транскрипты и саммари из Plaud через неофициальный API. Получение токена, эндпоинты, Python-скрипты для массовой выгрузки в Notion, автоматический менеджмент токенов через plaud-toolkit.

Опубликовано

Единственный рабочий способ программно читать данные своего Plaud-аккаунта — через Bearer-токен, который хранится в localStorage браузера. Официального публичного API для личных аккаунтов пока не существует (Developer Platform — в закрытой бете).

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

📌
Для кого: пользователи Plaud Note и NotePin, которые хотят программно выгружать свои записи, транскрипты и саммари — например, для импорта в Notion, Obsidian или собственные пайплайны.

Как получить токен

Plaud-приложение в браузере хранит авторизационный токен в localStorage. Токен полноценный, живёт ~10 месяцев — после истечения просто повторите шаги.

Способ 1: через браузер (ручной)

Шаг 1. Откройте web.plaud.ai в Chrome и войдите в аккаунт.

Шаг 2. Откройте DevTools:

  • Mac: Cmd + Option + I
  • Windows / Linux: F12

Шаг 3. Перейдите во вкладку ApplicationLocal Storagehttps://web.plaud.ai.

Шаг 4. Скопируйте два ключа:

КлючЧто этоПример
tokenstrBearer-токен для авторизацииbearer eyJhbGciOiJIUzI1NiIs...
plaud_user_api_domainРегиональный API-домен вашего аккаунтаhttps://api-euc1.plaud.ai
⚠️
tokenstr уже содержит префикс bearer — копируйте строку целиком, включая это слово. Заголовок запроса: Authorization: bearer eyJ...

Шаг 5. Сохраните в файл .env:

PLAUD_TOKEN=bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
PLAUD_API_DOMAIN=https://api-euc1.plaud.ai

Способ 2: через plaud-toolkit (автоматический)

Open-source проект plaud-toolkit позволяет получить токен программно — через email и пароль, без ручного копирования из браузера.

# Установка
npm install -g plaud-toolkit

# Авторизация (токен сохраняется автоматически)
plaud login

Преимущества:

  • Токены обновляются автоматически за 30 дней до истечения
  • Не нужно открывать браузер и DevTools
  • Есть CLI, библиотека и MCP-сервер

Доступные CLI-команды:

  • plaud_list_recordings — список всех записей
  • plaud_get_transcript — транскрипт по ID записи
  • plaud_get_recording_detail — полные метаданные записи
  • plaud_user_info — информация об аккаунте
  • plaud_get_mp3_url — временная ссылка на MP3

Региональные домены

РегионДомен
Европа (EU)https://api-euc1.plaud.ai
СШАhttps://api.plaud.ai

Проверка токена

curl -H "Authorization: $PLAUD_TOKEN" \
     $PLAUD_API_DOMAIN/file/simple/web

Успешный ответ — JSON-массив с записями. Если 401 Unauthorized — токен скопирован неверно или истёк.


Доступные эндпоинты

Что получаемEndpointМетод
Список всех записей (id, название, дата, длительность)/file/simple/webGET
Транскрипт + AI-саммари конкретной записи/file/detail/{file_id}GET
Аудиофайл (MP3)/file/download/{file_id}GET
Теги и папки аккаунта/filetag/GET

Работа со списком записей

Получить все записи

curl -H "Authorization: $PLAUD_TOKEN" \
     $PLAUD_API_DOMAIN/file/simple/web

Структура ответа (один элемент):

{
  "id": "a3f1c2d4e5b6789012345678abcdef01",
  "name": "Встреча с клиентом",
  "duration": 3720,
  "create_time": "2026-02-15T10:30:00Z",
  "status": "done"
}

Полезные jq-фильтры

# Только file_id
curl ... | jq -r '.[].id'

# id + название + дата (TSV)
curl ... | jq -r '.[] | [.id, .name, .create_time] | @tsv'

# Сортировка по дате (новые сначала)
curl ... | jq '[.[] | {id, name, create_time}] | sort_by(.create_time) | reverse'

Транскрипт и AI-саммари

Полный объект записи

curl -H "Authorization: $PLAUD_TOKEN" \
     $PLAUD_API_DOMAIN/file/detail/{file_id}

Ключевые поля:

ПолеСодержание
.data.trans_result.segmentsМассив сегментов: {start, end, speaker, text}
.data.ai_contentAI-саммари
.data.nameНазвание записи
.data.durationДлительность в секундах

Извлечение данных

# Чистый текст транскрипта
curl ... | jq -r '.data.trans_result.segments[].text' | tr '\n' ' '

# Транскрипт с таймкодами и спикерами
curl ... | jq -r '.data.trans_result.segments[] | "[\(.start)] \(.speaker): \(.text)"'

# Только AI-саммари
curl ... | jq '.data.ai_content'

# Название + саммари + дата
curl ... | jq '{name: .data.name, date: .data.create_time, summary: .data.ai_content}'

Пример вывода транскрипта:

[00:00:05] Speaker 1: Добрый день, начинаем встречу.
[00:00:12] Speaker 2: Спасибо, я готов.

Скачивание аудио

# Скачать MP3
curl -H "Authorization: $PLAUD_TOKEN" \
     $PLAUD_API_DOMAIN/file/download/{file_id} \
     -o "recording.mp3"

# Скачать с оригинальным именем
NAME=$(curl -s -H "Authorization: $PLAUD_TOKEN" \
     $PLAUD_API_DOMAIN/file/detail/{file_id} \
     | jq -r '.data.name')

curl -H "Authorization: $PLAUD_TOKEN" \
     $PLAUD_API_DOMAIN/file/download/{file_id} \
     -o "${NAME}.mp3"

Python: массовая выгрузка

Базовая настройка

import os
import requests
from dotenv import load_dotenv

load_dotenv()

TOKEN = os.getenv("PLAUD_TOKEN")
DOMAIN = os.getenv("PLAUD_API_DOMAIN")
HEADERS = {"Authorization": TOKEN}

def get(endpoint):
    resp = requests.get(f"{DOMAIN}{endpoint}", headers=HEADERS)
    resp.raise_for_status()
    return resp.json()

Получить все записи

files = get("/file/simple/web")
for f in files:
    print(f"{f['id']} | {f['name']} | {f['create_time']}")

Транскрипт и саммари

def get_detail(file_id):
    data = get(f"/file/detail/{file_id}")["data"]
    segments = data.get("trans_result", {}).get("segments", [])
    transcript = " ".join(s["text"] for s in segments)
    return {
        "name": data["name"],
        "date": data["create_time"],
        "duration": data["duration"],
        "transcript": transcript,
        "summary": data.get("ai_content", "")
    }

Массовый экспорт в JSON

import json
from time import sleep

files = get("/file/simple/web")
all_data = []

for i, f in enumerate(files):
    print(f"[{i+1}/{len(files)}] {f['name']}")
    try:
        detail = get_detail(f["id"])
        all_data.append(detail)
        sleep(0.5)  # пауза, чтобы не нагружать API
    except Exception as e:
        print(f"  Ошибка: {e}")

with open("plaud_export.json", "w", encoding="utf-8") as out:
    json.dump(all_data, out, ensure_ascii=False, indent=2)

print(f"Экспортировано {len(all_data)} записей.")

Массовая загрузка в Notion

🎯
Зачем: Zapier при первом подключении не вытягивает исторические записи — только новые. Этот скрипт загружает все существующие записи в базу Notion за один прогон.

Настройка .env

PLAUD_TOKEN=bearer eyJ...
PLAUD_API_DOMAIN=https://api-euc1.plaud.ai
NOTION_TOKEN=secret_...
NOTION_DATABASE_ID=ваш-id-базы-данных

Скрипт

import os
import requests
from time import sleep
from dotenv import load_dotenv

load_dotenv()

# --- Plaud ---
PLAUD_TOKEN = os.getenv("PLAUD_TOKEN")
PLAUD_DOMAIN = os.getenv("PLAUD_API_DOMAIN")
PLAUD_HEADERS = {"Authorization": PLAUD_TOKEN}

# --- Notion ---
NOTION_TOKEN = os.getenv("NOTION_TOKEN")
NOTION_DB_ID = os.getenv("NOTION_DATABASE_ID")
NOTION_HEADERS = {
    "Authorization": f"Bearer {NOTION_TOKEN}",
    "Content-Type": "application/json",
    "Notion-Version": "2022-06-28"
}

def plaud_get(endpoint):
    r = requests.get(f"{PLAUD_DOMAIN}{endpoint}", headers=PLAUD_HEADERS)
    r.raise_for_status()
    return r.json()

def get_detail(file_id):
    data = plaud_get(f"/file/detail/{file_id}")["data"]
    segments = data.get("trans_result", {}).get("segments", [])
    transcript = "\n".join(
        f"[{s.get('start', '')}] {s.get('speaker', '')}: {s['text']}"
        for s in segments
    )
    return {
        "name": data.get("name", "Без названия"),
        "date": data.get("create_time", ""),
        "transcript": transcript,
        "summary": data.get("ai_content", "")
    }

def create_notion_page(record):
    summary_short = record["summary"][:2000] if record["summary"] else ""
    payload = {
        "parent": {"database_id": NOTION_DB_ID},
        "properties": {
            "Name": {"title": [{"text": {"content": record["name"]}}]},
            "Date": {"date": {"start": record["date"]}},
            "Summary": {"rich_text": [{"text": {"content": summary_short}}]}
        },
        "children": [{
            "object": "block",
            "type": "paragraph",
            "paragraph": {
                "rich_text": [{
                    "type": "text",
                    "text": {"content": record["transcript"][:2000]}
                }]
            }
        }]
    }
    r = requests.post(
        "https://api.notion.com/v1/pages",
        headers=NOTION_HEADERS, json=payload
    )
    r.raise_for_status()
    return r.json()["url"]

# --- Основной цикл ---
files = plaud_get("/file/simple/web")
print(f"Найдено записей: {len(files)}")

for i, f in enumerate(files):
    print(f"[{i+1}/{len(files)}] {f['name']}")
    try:
        record = get_detail(f["id"])
        url = create_notion_page(record)
        print(f"  ✓ {url}")
        sleep(0.5)
    except Exception as e:
        print(f"  ✗ Ошибка: {e}")

print("Готово!")

Как найти file_id

File ID — 32-символьная hex-строка. Три способа получить:

  1. Из URL в браузере: откройте запись на web.plaud.ai — ID в адресной строке: web.plaud.ai/file/{file_id}
  2. Из API: поле id в ответе /file/simple/web
  3. Через jq: curl ... /file/simple/web | jq -r '.[0].id'

Риски и ограничения

Конкретных случаев блокировки аккаунтов за использование tokenstr не зафиксировано — ни в Reddit-сообществе PlaudNoteUsers, ни в GitHub Issues. Open-source сообщество использует метод с 2024 года.

Что безопасно

  • Вы обращаетесь к своим данным через тот же токен, что использует веб-приложение. Для сервера это неотличимо от обычного запроса из браузера
  • Несколько публичных проектов (plaud-toolkit, OpenPlaud, плагины для Obsidian, n8n, OpenClaw Skills) работают на этом методе

Реальные риски

РискЧто происходитРешение
Rate limit (429)Слишком частые запросы — временное ограничениеsleep(0.5–1) между запросами
Изменение APIPlaud может изменить структуру без предупреждения — скрипты сломаютсяОбработка ошибок, слежение за GitHub-репозиториями
Истечение токенаТокен перестаёт работать через ~10 месяцевПовторно извлечь из localStorage или использовать plaud-toolkit (авто-обновление)
Серая зона ToSPlaud не запрещает и не разрешает явноПрецедентов блокировки нет; для постоянной автоматизации лучше Zapier-триггер

Ошибки и решения

ОшибкаПричинаРешение
401 UnauthorizedТокен истёк или скопирован без bearer Повторно извлеките tokenstr, копируйте целиком
Пустой транскриптЗапись ещё обрабатываетсяПроверьте статус в приложении Plaud
Пустой ответ /file/detail/Неверный file_idПроверьте id через /file/simple/web
Ошибка подключенияНеверный региональный доменПроверьте plaud_user_api_domain в localStorage
429 Too Many RequestsСлишком частые запросыДобавьте sleep(0.5–1) в цикл

Что нового в экосистеме Plaud (март 2026)

  • Plaud Desktop (бета) — приложение, которое автоматически определяет видеозвонки в Zoom, Google Meet и Teams и записывает их нативно, без бота
  • Ask Plaud Skills (бета) — 15+ встроенных навыков + до 10 кастомных скиллов с собственными промптами
  • Инфографика из Ask Plaud — генерация инфографики из транскриптов встреч
  • Plaud NotePin S — новое hardware-устройство с физической кнопкой старта и закладками
  • Developer Platform — официальная платформа API и SDK для бизнеса (закрытая бета с октября 2025)

Ссылки

РесурсСсылка
Plaud Webweb.plaud.ai
plaud-toolkit (авто-токен, CLI, MCP)github.com/sergivalverde/plaud-toolkit
OpenPlaud (self-hosted транскрипция)github.com/openplaud/openplaud
Plaud Sync for Obsidiangithub.com/leonardsellem/plaud-sync-for-obsidian
Plaud Release Notesplaud.ai/pages/plaud-release-notes
Developer Platformplaud.ai/pages/developer-platform

По теме