Referenční příručka API
Přehled
Tato stránka popisuje současný kontrakt Nibomo pro externí AI agenty.
Pokud váš klient podporuje MCP, nejjednodušším způsobem připojení je MCP konektor, který obaluje stejné datové rozhraní. Tato stránka popisuje HTTP kontrakt pro discovery, SQL, příručky a opakování, který používají CLI agenti.
Začněte u kanonického vstupního bodu pro discovery:
GET https://api.nibomo.com/v1/
Stejný obsah discovery je dostupný i na GET /v1/agent, hlavním veřejným vstupním bodem je ale /v1/.
Odpověď discovery agentovi vysvětlí, jak:
- zahájit přihlášení přes e-mailový OTP
- vyměnit OTP za dlouhodobý API klíč
- načíst kontext účtu
- vytvořit nebo vybrat pracovní prostor
- pokračovat přes zveřejněné SQL rozhraní
- načítat referenční příručky a opakovat kartičky jednu po druhé
Discovery za běhu a zdrojový kód
OpenAPI není k dispozici. Čtyři dřívější URL specifikací uvedené níže teď místo schématu vracejí stejné JSON oznámení discovery s "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
Pro aktuální discovery za běhu použijte GET https://api.nibomo.com/v1/. Aktuální endpointy najdete přes vrácenou docs.discoveryUrl a podrobnosti implementace přes docs.source.agentRoutesUrl.
Inicializace autentizace
Inicializace pomocí OTP probíhá v autentizační službě:
POST https://auth.nibomo.com/api/agent/send-codePOST https://auth.nibomo.com/api/agent/verify-code
Postup:
- Zavolejte
GET /v1/. - Odešlete e-mail uživatele na
send-code. - Z odpovědi přečtěte
otpSessionToken. - Požádejte uživatele o nejnovější osmimístný kód z e-mailu.
- Zavolejte
verify-codes hodnotamicode,otpSessionTokenalabel. - Vrácený API klíč uložte mimo paměť chatu.
Doporučená proměnná prostředí:
export FLASHCARDS_OPEN_SOURCE_API_KEY="fca_ABCDEFGH_0123456789ABCDEFGHJKMNPQRS"
Ověřené požadavky používají:
Authorization: ApiKey <key>
Příklad inicializační sekvence:
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"
}'
Rozhraní agenta po přihlášení
Po ověření je současné rozhraní agenta toto:
GET /v1/agent/meGET /v1/agent/workspacesPOST /v1/agent/workspacesPOST /v1/agent/workspaces/{workspaceId}/selectPOST /v1/agent/sql/query(pouze čtení)POST /v1/agent/sql/execute(zápis)GET /v1/agent/guide/{topic}(pouze čtení)POST /v1/agent/reviews/next(pouze čtení)POST /v1/agent/reviews/reveal(pouze čtení)POST /v1/agent/reviews/submit(zápis)
Typická inicializace vypadá takto:
GET /v1/agent/meGET /v1/agent/workspaces?limit=100- V případě potřeby
POST /v1/agent/workspacess{"name":"Personal"} - V případě potřeby
POST /v1/agent/workspaces/{workspaceId}/select - Pro čtení použijte
POST /v1/agent/sql/querya pro zápisPOST /v1/agent/sql/execute
Výběr pracovního prostoru je explicitní pro každé připojení s API klíčem. Agenti by se místo hádání dalšího kroku měli řídit vráceným textem instructions a pro aktuální endpointy adresou docs.discoveryUrl, pro podrobnosti implementace pak docs.source.agentRoutesUrl.
SQL endpointy a endpointy pro opakování přijímají v těle JSON také volitelné workspaceId. Pro jedno volání tím cílíte na daný pracovní prostor, aniž by se změnil výběr; když ho vynecháte, použije se vybraný pracovní prostor. Pokud není vybraný pracovní prostor ani zadané workspaceId, vrátí 409 WORKSPACE_SELECTION_REQUIRED.
SQL rozhraní
POST /v1/agent/sql/query je rozhraní výhradně pro čtení (SHOW TABLES, DESCRIBE, SHOW COLUMNS, SELECT) a POST /v1/agent/sql/execute je rozhraní pro zápis (INSERT, UPDATE, DELETE); jedno volání musí obsahovat buď jen čtení, nebo jen zápisy.
Rozhraní je záměrně omezené a nejde o plnohodnotný PostgreSQL. Tato dokumentace popisuje pouze podporovaný dialekt a neslouží jako přehled kompatibility s PostgreSQL.
Žádná cesta pro čtení neopravuje data, nepřepočítává plánování ani nemění stav kartiček. Pro každý zápis kartiček a balíčků použijte POST /v1/agent/sql/execute. SQL nemůže zapisovat do review_events ani do stavu plánování FSRS; opakování zaznamenávejte přes POST /v1/agent/reviews/submit.
Aktuální skupiny příkazů:
SHOW TABLESDESCRIBE <resource>SHOW COLUMNS FROM <resource>SELECTINSERTUPDATEDELETE
Zveřejněné logické zdroje aktuálně zahrnují:
workspacecardsdecksreview_events
Poznámky:
LIMITmá výchozí hodnotu100a nelze ho nastavit nad100- pro stabilní stránkování použijte
ORDER BY - ke zjištění schématu použijte
SHOW TABLESneboDESCRIBE cards - každé SQL volání se týká jednoho pracovního prostoru: toho, jehož
workspaceIdje v těle požadavku, nebo vybraného pracovního prostoru
Příklad požadavku:
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"}'
Příklad dotazu na kartičky:
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"
}'
Příklad změny dat:
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'\''"
}'
K dispozici je také vzdálený MCP server na https://mcp.nibomo.com/mcp, který používá OAuth 2.1 (Dynamic Client Registration + PKCE). Nabízí stejné rozdělení SQL na sql_query (výhradně čtení) a sql_execute (zápis), k tomu list_workspaces, get_guide a nástroje pro opakování next_review_card, reveal_answer a submit_review; viz MCP konektor.
Bezpečnost a rozsah
SQL rozhraní je uzavřený dialekt vynucovaný parserem, nikoli přímý přístup k PostgreSQL. Ochranná opatření:
- Uzavřený seznam povolených příkazů: pro čtení pouze
SHOW TABLES,DESCRIBE,SHOW COLUMNSaSELECT, pro zápisINSERT,UPDATEaDELETE. Cokoli jiného je odmítnuto už při parsování. - Omezené zdroje: příkazy mohou pracovat pouze se zdroji
workspace,cards,decksareview_events. - Omezení na pracovní prostor: každý příkaz se týká jednoho pracovního prostoru, ke kterému máte přístup, buď toho s
workspaceIdv těle požadavku, nebo vybraného pracovního prostoru, bez přístupu napříč tenanty. - Striktní těla požadavků: SQL endpointy a endpointy pro opakování odmítnou neznámé pole v těle, takže překlep v
workspaceIdskončí chybou, místo aby se příkaz provedl nad vybraným pracovním prostorem. - Limity: nejvýše
100řádků na příkaz, nejvýše50příkazů na dávku a výsledek omezený zhruba na12ktokenů. Dávky změn se provádějí atomicky. - Oddělení čtení a zápisu:
sql_queryalist_workspacesjsou výhradně pro čtení (readOnlyHint) a nikdy neopravují data, nepřepočítávají plánování ani nemění stav kartiček.sql_executeje jediný SQL nástroj pro zápis a provádí zápisy (destructiveHint); jedno volání musí obsahovat buď jen čtení, nebo jen zápisy. SQL nemůže zapisovat doreview_eventsani do stavu plánování FSRS; opakování zaznamenává pouzePOST /v1/agent/reviews/submit(v MCPsubmit_review).
Příručky
GET /v1/agent/guide/{topic} vrací jednu referenční příručku v data.guide, se stejným obsahem, jaký poskytuje MCP nástroj get_guide. Témata:
sql_dialect: úplná gramatika SQL, limity a příkladycard_authoring: kontrakt kartičky, štítky, kontroly duplicit a formátováníbulk_authoring: rozdělení a ověření rozsáhlé zápisové úlohyreview_flow: cyklus opakování a hodnocení
Na neznámé téma vrátí 400 se seznamem podporovaných témat. Před tvorbou kartiček, hromadným zápisem nebo opakováním si načtěte příslušnou příručku a po odmítnutém příkazu si znovu přečtěte sql_dialect.
curl https://api.nibomo.com/v1/agent/guide/sql_dialect \
-H "Authorization: ApiKey $FLASHCARDS_OPEN_SOURCE_API_KEY"
Opakování
Endpointy pro opakování umožňují agentovi zkoušet studujícího po jedné kartičce a ukládat každé hodnocení do plánu FSRS dané kartičky. Přijímají stejné JSON argumenty jako MCP nástroje pro opakování:
POST /v1/agent/reviews/nextvracícardscardIdafrontText, nebocard: null, když není nic na řadě. Frontu zúží volitelnétags(kterýkoli z nich) nebodeckId, nikdy obojí najednou; požadavek bez těla je platný.POST /v1/agent/reviews/revealvyžadujecardIda vracíbackTextdané kartičky.POST /v1/agent/reviews/submitvyžadujecardId, UUIDreviewIdvygenerované klientem,ratings hodnotouAgain,Hard,GoodneboEasya IANA časové pásmo studujícíhoreviewedTimeZone. Server doplní čas opakování a vrátí nový plán kartičky včetnědueAt,state,repsalapses.
Všechny tři endpointy přijímají volitelné workspaceId. Před odesláním si reviewId uložte a nejisté odeslání zopakujte se zcela stejným požadavkem; druhé opakování se tím nikdy nezaznamená. Endpointy pro opakování mohou vrátit také:
409 REVIEW_EVENT_CONFLICT: opakování už bylo zaznamenáno aerror.details.reviewScheduleobsahuje aktuální plán kartičky.409 REVIEW_ID_CARD_MISMATCH:reviewIduž označuje opakování jiné kartičky, takže se nic neuložilo; odešlete znovu s novýmreviewId.409 REVIEW_STALE: uložený čas opakování kartičky je stejný jako aktuální čas serveru nebo pozdější; opakujte jinou kartičku.400 REVIEW_INPUT_INVALID: některý argument chybí, je neplatný nebo nepodporovaný, včetně kombinacetagssdeckIdnebo štítku, který pracovní prostor nepoužívá.
Příklad odeslání:
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 pro lidi a synchronizaci
Nibomo obsahuje také samostatná API pro lidské klienty a synchronizaci offline-first, nejsou ale hlavním kontraktem pro externí agenty:
- postupy v prohlížeči používají cookies na sdílené doméně a ochranu proti CSRF
- klienti offline-first používají implementované synchronizační endpointy
/v1/workspaces/{workspaceId}/sync/pusha/v1/workspaces/{workspaceId}/sync/pull - synchronizační endpointy jsou oddělené od rozhraní pro externí agenty