Dokumentacja API
Przegląd
Ta strona opisuje obecny kontrakt Nibomo dla zewnętrznych agentów AI.
Jeśli Twój klient obsługuje MCP, konektor MCP jest najprostszym sposobem połączenia i działa na tym samym interfejsie danych. Ta strona opisuje kontrakt HTTP dla discovery, SQL, przewodników i powtórek, z którego korzystają agenci CLI.
Zacznij od kanonicznego punktu wejścia discovery:
GET https://api.nibomo.com/v1/
Ta sama odpowiedź discovery jest dostępna również pod GET /v1/agent, ale głównym publicznym punktem wejścia jest /v1/.
Odpowiedź discovery wyjaśnia agentowi, jak:
- rozpocząć logowanie kodem OTP z e-maila
- wymienić kod OTP na długoterminowy klucz API
- wczytać kontekst konta
- utworzyć lub wybrać obszar roboczy
- kontynuować pracę przez opublikowany interfejs SQL
- pobierać przewodniki referencyjne i powtarzać karty jedna po drugiej
Discovery w czasie działania i kod źródłowy
OpenAPI jest niedostępne. Cztery dawne adresy URL specyfikacji poniżej zwracają teraz zamiast schematu ten sam komunikat discovery w formacie JSON z "openapiAvailable": false:
https://api.nibomo.com/v1/agent/openapi.jsonhttps://api.nibomo.com/v1/agent/swagger.jsonhttps://api.nibomo.com/v1/openapi.jsonhttps://api.nibomo.com/v1/swagger.json
Do aktualnego discovery w czasie działania używaj GET https://api.nibomo.com/v1/. Trasy dostępne w czasie działania znajdziesz pod zwróconym docs.discoveryUrl, a szczegóły implementacji pod docs.source.agentRoutesUrl.
Inicjalizacja uwierzytelniania
Inicjalizacja OTP odbywa się w usłudze uwierzytelniania:
POST https://auth.nibomo.com/api/agent/send-codePOST https://auth.nibomo.com/api/agent/verify-code
Przebieg wygląda tak:
- Wywołaj
GET /v1/. - Wyślij adres e-mail użytkownika do
send-code. - Odczytaj
otpSessionTokenz odpowiedzi. - Poproś użytkownika o najnowszy 8-cyfrowy kod z e-maila.
- Wywołaj
verify-codezcode,otpSessionTokenilabel. - Zapisz zwrócony klucz API poza pamięcią czatu.
Zalecana zmienna środowiskowa:
export FLASHCARDS_OPEN_SOURCE_API_KEY="fca_ABCDEFGH_0123456789ABCDEFGHJKMNPQRS"
Uwierzytelnione żądania używają nagłówka:
Authorization: ApiKey <key>
Przykładowa sekwencja inicjalizacji:
curl https://api.nibomo.com/v1/
curl -X POST https://auth.nibomo.com/api/agent/send-code \
-H "Content-Type: application/json" \
-d '{"email":"you@example.com"}'
curl -X POST https://auth.nibomo.com/api/agent/verify-code \
-H "Content-Type: application/json" \
-d '{
"code":"12345678",
"otpSessionToken":"...",
"label":"Codex on MacBook"
}'
Interfejs agenta po zalogowaniu
Po weryfikacji obecny interfejs agenta obejmuje:
GET /v1/agent/meGET /v1/agent/workspacesPOST /v1/agent/workspacesPOST /v1/agent/workspaces/{workspaceId}/selectPOST /v1/agent/sql/query(tylko odczyt)POST /v1/agent/sql/execute(zapis)GET /v1/agent/guide/{topic}(tylko odczyt)POST /v1/agent/reviews/next(tylko odczyt)POST /v1/agent/reviews/reveal(tylko odczyt)POST /v1/agent/reviews/submit(zapis)
Typowa inicjalizacja wygląda tak:
GET /v1/agent/meGET /v1/agent/workspaces?limit=100- W razie potrzeby
POST /v1/agent/workspacesz{"name":"Personal"} - W razie potrzeby
POST /v1/agent/workspaces/{workspaceId}/select - Używaj
POST /v1/agent/sql/querydo odczytu iPOST /v1/agent/sql/executedo zapisu
Obszar roboczy wybiera się jawnie, osobno dla każdego połączenia kluczem API. Zamiast zgadywać kolejny krok, agenci powinni postępować zgodnie ze zwróconym tekstem instructions oraz korzystać z docs.discoveryUrl w przypadku tras dostępnych w czasie działania i z docs.source.agentRoutesUrl w przypadku szczegółów implementacji.
Trasy SQL i powtórek przyjmują też opcjonalne pole workspaceId w treści JSON. Kieruje ono pojedyncze wywołanie do wskazanego obszaru roboczego bez zmiany wyboru; pomiń je, aby użyć wybranego obszaru roboczego. Gdy nie ma ani wybranego obszaru, ani workspaceId, trasy zwracają 409 WORKSPACE_SELECTION_REQUIRED.
Interfejs SQL
POST /v1/agent/sql/query to interfejs wyłącznie do odczytu (SHOW TABLES, DESCRIBE, SHOW COLUMNS, SELECT), a POST /v1/agent/sql/execute to interfejs zapisu (INSERT, UPDATE, DELETE); pojedyncze wywołanie musi zawierać wyłącznie odczyty albo wyłącznie zapisy.
Interfejs jest celowo ograniczony i nie jest to pełny PostgreSQL. Ta dokumentacja obejmuje tylko obsługiwany dialekt i nie jest opisem zgodności z PostgreSQL.
Żadna ścieżka odczytu nie naprawia danych, nie przelicza harmonogramu ani nie zmienia stanu kart. Używaj
POST /v1/agent/sql/execute do każdego zapisu kart i talii. SQL nie może zapisywać
review_events ani stanu harmonogramu FSRS; powtórki zapisuj przez
POST /v1/agent/reviews/submit.
Obecnie obsługiwane rodzaje instrukcji:
SHOW TABLESDESCRIBE <resource>SHOW COLUMNS FROM <resource>SELECTINSERTUPDATEDELETE
Opublikowane zasoby logiczne obejmują obecnie:
workspacecardsdecksreview_events
Uwagi:
LIMITdomyślnie wynosi100i nie może przekroczyć100- używaj
ORDER BY, gdy potrzebujesz stabilnej paginacji - do poznania schematu używaj
SHOW TABLESlubDESCRIBE cards - każde wywołanie SQL dotyczy jednego obszaru roboczego: wskazanego przez
workspaceIdw treści żądania albo wybranego obszaru roboczego
Przykładowe żądanie:
curl -X POST https://api.nibomo.com/v1/agent/sql/query \
-H "Content-Type: application/json" \
-H "Authorization: ApiKey $FLASHCARDS_OPEN_SOURCE_API_KEY" \
-d '{"sql":"SHOW TABLES"}'
Przykładowe zapytanie o karty:
curl -X POST https://api.nibomo.com/v1/agent/sql/query \
-H "Content-Type: application/json" \
-H "Authorization: ApiKey $FLASHCARDS_OPEN_SOURCE_API_KEY" \
-d '{
"sql":"SELECT card_id, front_text, back_text, tags FROM cards ORDER BY updated_at DESC LIMIT 20 OFFSET 0"
}'
Przykładowa modyfikacja:
curl -X POST https://api.nibomo.com/v1/agent/sql/execute \
-H "Content-Type: application/json" \
-H "Authorization: ApiKey $FLASHCARDS_OPEN_SOURCE_API_KEY" \
-d '{
"sql":"UPDATE cards SET back_text = '\''Updated answer'\'' WHERE card_id = '\''50b5b928-7f04-4cc8-878d-6cd0e8b98474'\''"
}'
Dostępny jest też zdalny serwer MCP pod adresem https://mcp.nibomo.com/mcp, korzystający z OAuth 2.1 (Dynamic Client Registration + PKCE). Udostępnia ten sam podział SQL jako sql_query (wyłącznie odczyt) i sql_execute (zapis), a do tego list_workspaces, get_guide oraz narzędzia powtórek next_review_card, reveal_answer i submit_review; zobacz konektor MCP.
Bezpieczeństwo i zakres
Interfejs SQL to wydzielony dialekt, którego reguły egzekwuje parser, a nie surowy PostgreSQL. Zabezpieczenia są następujące:
- Zamknięta lista dozwolonych instrukcji: do odczytu tylko
SHOW TABLES,DESCRIBE,SHOW COLUMNSiSELECT, a do zapisuINSERT,UPDATEiDELETE. Wszystko inne jest odrzucane już na etapie parsowania. - Ograniczone zasoby: instrukcje mogą dotyczyć wyłącznie zasobów
workspace,cards,decksireview_events. - Zakres jednego obszaru roboczego: każda instrukcja dotyczy jednego obszaru roboczego, do którego masz dostęp — wskazanego przez
workspaceIdw treści żądania albo wybranego przez Ciebie — bez dostępu między tenantami. - Ścisłe treści żądań: trasy SQL i powtórek odrzucają nieznane pole w treści żądania, więc błędnie zapisane
workspaceIdkończy się błędem, zamiast zostać wykonane na wybranym obszarze roboczym. - Limity: do
100wierszy na instrukcję, do50instrukcji na partię i limit wyniku około12ktokenów. Partie modyfikacji są stosowane atomowo. - Podział na odczyt i zapis:
sql_queryilist_workspacessłużą wyłącznie do odczytu (readOnlyHint) i nigdy nie naprawiają danych, nie przeliczają harmonogramu ani nie zmieniają stanu kart.sql_executeto jedyne narzędzie SQL do zapisu i wykonuje zapisy (destructiveHint); pojedyncze wywołanie musi zawierać wyłącznie odczyty albo wyłącznie zapisy. SQL nie może zapisywaćreview_eventsani stanu harmonogramu FSRS; powtórkę zapisuje wyłączniePOST /v1/agent/reviews/submit(w MCPsubmit_review).
Przewodniki
GET /v1/agent/guide/{topic} zwraca jeden przewodnik referencyjny w data.guide — tę samą treść, którą udostępnia narzędzie MCP get_guide. Tematy:
sql_dialect: pełna gramatyka SQL, limity i przykładycard_authoring: kontrakt karty, tagi, sprawdzanie duplikatów i formatowaniebulk_authoring: dzielenie i weryfikacja dużego zadania zapisureview_flow: pętla powtórek i ocen
Nieznany temat zwraca 400 z listą obsługiwanych tematów. Pobierz odpowiedni przewodnik przed tworzeniem kart, zapisem masowym lub przeprowadzeniem powtórki, a po odrzuceniu instrukcji ponownie przeczytaj sql_dialect.
curl https://api.nibomo.com/v1/agent/guide/sql_dialect \
-H "Authorization: ApiKey $FLASHCARDS_OPEN_SOURCE_API_KEY"
Powtórki
Trasy powtórek pozwalają agentowi przepytywać osobę uczącą się karta po karcie i zapisywać każdą ocenę w harmonogramie FSRS karty. Przyjmują te same argumenty JSON co narzędzia powtórek MCP:
POST /v1/agent/reviews/nextzwracacardzcardIdifrontTextalbocard: null, gdy nic nie czeka na powtórkę. Opcjonalnetags(wystarczy dowolny z tagów) lubdeckIdzawężają kolejkę, ale nigdy oba jednocześnie; żądanie bez treści jest prawidłowe.POST /v1/agent/reviews/revealwymagacardIdi zwracabackTexttej karty.POST /v1/agent/reviews/submitwymagacardId, wygenerowanego przez klienta UUIDreviewId, ocenyratingo wartościAgain,Hard,GoodlubEasyoraz strefy czasowej IANA osoby uczącej się wreviewedTimeZone. Serwer nadaje czas powtórki i zwraca nowy harmonogram karty, w tymdueAt,state,repsilapses.
Wszystkie trzy trasy przyjmują opcjonalne workspaceId. Zapisz reviewId przed wysłaniem, a jeśli nie wiadomo, czy wysłanie się powiodło, ponów je identycznym żądaniem; nigdy nie zapisze to drugiej powtórki. Trasy powtórek mogą też zwrócić:
409 REVIEW_EVENT_CONFLICT: powtórka została już zapisana, aerror.details.reviewSchedulezawiera bieżący harmonogram karty.409 REVIEW_ID_CARD_MISMATCH:reviewIdidentyfikuje już powtórkę innej karty, więc nic nie zostało zapisane; wyślij ponownie z nowymreviewId.409 REVIEW_STALE: zapisany czas powtórki karty jest równy bieżącemu czasowi serwera lub późniejszy; powtórz inną kartę.400 REVIEW_INPUT_INVALID: brakuje argumentu albo jest on nieprawidłowy lub nieobsługiwany, w tymtagspołączone zdeckIdlub tag, którego obszar roboczy nie używa.
Przykładowe wysłanie powtórki:
curl -X POST https://api.nibomo.com/v1/agent/reviews/submit \
-H "Content-Type: application/json" \
-H "Authorization: ApiKey $FLASHCARDS_OPEN_SOURCE_API_KEY" \
-d '{
"cardId":"693c4863-28a2-45e8-8f55-9fa31fc95ff2",
"reviewId":"429bb7cc-40fb-49f3-bb50-48a5db2826d1",
"rating":"Good",
"reviewedTimeZone":"Europe/Sofia"
}'
API dla ludzi i synchronizacji
Nibomo ma też osobne API dla klientów obsługiwanych przez ludzi i synchronizacji offline-first, ale nie stanowią one głównego kontraktu dla zewnętrznych agentów:
- przepływy w przeglądarce używają plików cookie we wspólnej domenie oraz ochrony CSRF
- klienci offline-first korzystają z zaimplementowanych tras synchronizacji
/v1/workspaces/{workspaceId}/sync/pushi/v1/workspaces/{workspaceId}/sync/pull - trasy synchronizacji są oddzielone od interfejsu dla zewnętrznych agentów