Referință API
Prezentare generală
Această pagină documentează contractul actual al Nibomo pentru agenții AI externi.
Dacă clientul tău acceptă MCP, conectorul MCP este cea mai simplă cale de conectare și se bazează pe aceeași interfață de date. Această pagină documentează contractul HTTP pentru descoperire, SQL, ghiduri și recapitulare folosit de agenții CLI.
Pornește de la punctul de intrare canonic pentru descoperire:
GET https://api.nibomo.com/v1/
Același răspuns de descoperire este disponibil și la GET /v1/agent, dar /v1/ este punctul de intrare public principal.
Răspunsul de descoperire îi arată agentului cum să:
- pornească autentificarea cu cod OTP primit pe e-mail
- schimbe codul OTP pe o cheie API cu durată lungă de valabilitate
- încarce contextul contului
- creeze sau selecteze un spațiu de lucru
- continue prin interfața SQL publicată
- obțină ghiduri de referință și recapituleze fișele una câte una
Descoperirea la rulare și codul sursă
OpenAPI nu este disponibil. Cele patru URL-uri de specificație de mai jos, folosite anterior, returnează acum aceeași notificare JSON de descoperire cu "openapiAvailable": false în loc de o schemă:
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
Folosește GET https://api.nibomo.com/v1/ pentru descoperirea actuală la rulare. Urmează docs.discoveryUrl din răspuns pentru rutele disponibile la rulare și docs.source.agentRoutesUrl pentru detaliile de implementare.
Inițializarea autentificării
Inițializarea OTP rulează pe serviciul de autentificare:
POST https://auth.nibomo.com/api/agent/send-codePOST https://auth.nibomo.com/api/agent/verify-code
Fluxul este:
- Apelează
GET /v1/. - Trimite adresa de e-mail a utilizatorului către
send-code. - Citește
otpSessionTokendin răspuns. - Cere-i utilizatorului cel mai recent cod de 8 cifre primit pe e-mail.
- Apelează
verify-codecucode,otpSessionTokenșilabel. - Salvează cheia API returnată în afara memoriei chatului.
Variabila de mediu recomandată:
export FLASHCARDS_OPEN_SOURCE_API_KEY="fca_ABCDEFGH_0123456789ABCDEFGHJKMNPQRS"
Cererile autentificate folosesc:
Authorization: ApiKey <key>
Exemplu de secvență de inițializare:
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"
}'
Interfața pentru agenți după autentificare
După verificare, interfața actuală pentru agenți este:
GET /v1/agent/meGET /v1/agent/workspacesPOST /v1/agent/workspacesPOST /v1/agent/workspaces/{workspaceId}/selectPOST /v1/agent/sql/query(doar citire)POST /v1/agent/sql/execute(scriere)GET /v1/agent/guide/{topic}(doar citire)POST /v1/agent/reviews/next(doar citire)POST /v1/agent/reviews/reveal(doar citire)POST /v1/agent/reviews/submit(scriere)
O inițializare tipică arată așa:
GET /v1/agent/meGET /v1/agent/workspaces?limit=100- Dacă e nevoie,
POST /v1/agent/workspacescu{"name":"Personal"} - Dacă e nevoie,
POST /v1/agent/workspaces/{workspaceId}/select - Folosește
POST /v1/agent/sql/querypentru citiri șiPOST /v1/agent/sql/executepentru scrieri
Selecția spațiului de lucru este explicită pentru fiecare conexiune cu cheie API. Agenții trebuie să urmeze textul instructions returnat și docs.discoveryUrl pentru rutele disponibile la rulare, plus docs.source.agentRoutesUrl pentru detaliile de implementare, în loc să ghicească pasul următor.
Rutele SQL și de recapitulare acceptă și un workspaceId opțional în corpul JSON. Acesta țintește spațiul de lucru respectiv pentru un singur apel, fără să schimbe selecția; omite-l ca să folosești spațiul de lucru selectat. Fără o selecție și fără workspaceId, rutele răspund cu 409 WORKSPACE_SELECTION_REQUIRED.
Interfața SQL
POST /v1/agent/sql/query este interfața strict de citire (SHOW TABLES, DESCRIBE, SHOW COLUMNS, SELECT), iar POST /v1/agent/sql/execute este interfața de scriere (INSERT, UPDATE, DELETE); un singur apel trebuie să conțină doar citiri sau doar scrieri.
Este limitată intenționat și nu este PostgreSQL complet. Această documentație acoperă doar dialectul acceptat, nu este o referință de compatibilitate cu PostgreSQL.
Nicio operație de citire nu repară date, nu recalculează programarea și nu schimbă starea fișelor. Folosește POST /v1/agent/sql/execute pentru orice scriere de fișe și pachete. SQL nu poate modifica nici review_events, nici starea de programare FSRS; înregistrează recapitulările prin POST /v1/agent/reviews/submit.
Familiile de instrucțiuni acceptate în prezent:
SHOW TABLESDESCRIBE <resource>SHOW COLUMNS FROM <resource>SELECTINSERTUPDATEDELETE
Resursele logice publicate includ în prezent:
workspacecardsdecksreview_events
Note:
LIMITare valoarea implicită100și maximul100- folosește
ORDER BYcând ai nevoie de paginare stabilă - folosește
SHOW TABLESsauDESCRIBE cardspentru descoperirea schemei - fiecare apel SQL este limitat la un singur spațiu de lucru:
workspaceIddin corpul cererii sau spațiul de lucru selectat
Exemplu de cerere:
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"}'
Exemplu de interogare a fișelor:
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"
}'
Exemplu de modificare:
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'\''"
}'
Este disponibil și un server MCP la distanță la https://mcp.nibomo.com/mcp, care folosește OAuth 2.1 (Dynamic Client Registration + PKCE). Acesta expune aceeași separare SQL prin sql_query (strict de citire) și sql_execute (scriere), plus list_workspaces, get_guide și instrumentele de recapitulare next_review_card, reveal_answer și submit_review; consultă conectorul MCP.
Siguranță și domeniu de acces
Interfața SQL este un dialect restrâns, impus de parser, nu PostgreSQL brut. Măsurile de protecție sunt:
- Listă închisă de instrucțiuni permise: doar
SHOW TABLES,DESCRIBE,SHOW COLUMNSșiSELECTpentru citiri șiINSERT,UPDATEșiDELETEpentru scrieri. Orice altceva este respins la analiza sintactică. - Resurse limitate: instrucțiunile pot accesa doar resursele
workspace,cards,decksșireview_events. - Limitare la nivel de spațiu de lucru: fiecare instrucțiune este limitată la un singur spațiu de lucru la care ai acces, fie
workspaceIddin corpul cererii, fie spațiul de lucru selectat, fără acces la datele altor tenanți. - Corpuri de cerere stricte: rutele SQL și de recapitulare resping orice câmp necunoscut din corpul cererii, așa că un
workspaceIdscris greșit eșuează în loc să ruleze pe spațiul de lucru selectat. - Limite: cel mult
100de rânduri per instrucțiune, cel mult50de instrucțiuni per lot și o limită a rezultatului de aproximativ12ktokeni. Loturile de modificări se aplică atomic. - Separare citire/scriere:
sql_queryșilist_workspacessunt strict de citire (readOnlyHint) și nu repară niciodată date, nu recalculează programarea și nu schimbă starea fișelor.sql_executeeste singurul instrument SQL de scriere și efectuează scrieri (destructiveHint); un singur apel trebuie să conțină doar citiri sau doar scrieri. SQL nu poate modifica nicireview_events, nici starea de programare FSRS; doarPOST /v1/agent/reviews/submit(în MCP,submit_review) înregistrează o recapitulare.
Ghiduri
GET /v1/agent/guide/{topic} returnează un ghid de referință în data.guide, același conținut pe care îl oferă instrumentul MCP get_guide. Subiecte:
sql_dialect: gramatica SQL completă, limitele și exemplecard_authoring: contractul fișelor, etichete, verificarea duplicatelor și formatarebulk_authoring: împărțirea și verificarea unei sarcini mari de scrierereview_flow: bucla de recapitulare și evaluare
Un subiect necunoscut primește răspunsul 400, cu lista subiectelor acceptate. Obține ghidul potrivit înainte să creezi fișe, să scrii în volum mare sau să rulezi o recapitulare, și recitește sql_dialect după o instrucțiune respinsă.
curl https://api.nibomo.com/v1/agent/guide/sql_dialect \
-H "Authorization: ApiKey $FLASHCARDS_OPEN_SOURCE_API_KEY"
Recapitulări
Rutele de recapitulare îi permit unui agent să-l testeze pe cursant fișă cu fișă și să salveze fiecare evaluare în programarea FSRS a fișei. Ele primesc aceleași argumente JSON ca instrumentele MCP de recapitulare:
POST /v1/agent/reviews/nextreturneazăcardcucardIdșifrontText, saucard: nullcând nu este nimic scadent. Coada poate fi restrânsă opțional fie printags(oricare dintre etichete), fie prindeckId, niciodată prin ambele; o cerere fără corp este validă.POST /v1/agent/reviews/revealnecesităcardIdși returneazăbackTextal acelei fișe.POST /v1/agent/reviews/submitnecesităcardId, un UUIDreviewIdgenerat de client, unratingcu valoareaAgain,Hard,GoodsauEasyși fusul orar IANA al cursantului înreviewedTimeZone. Serverul marchează momentul recapitulării și returnează noua programare a fișei, inclusivdueAt,state,repsșilapses.
Toate cele trei rute acceptă workspaceId opțional. Salvează reviewId înainte de trimitere și reîncearcă o trimitere cu rezultat incert folosind exact aceeași cerere; aceasta nu înregistrează niciodată o a doua recapitulare. Rutele de recapitulare pot răspunde și cu:
409 REVIEW_EVENT_CONFLICT: recapitularea a fost deja înregistrată, iarerror.details.reviewScheduleconține programarea actuală a fișei.409 REVIEW_ID_CARD_MISMATCH:reviewIdidentifică deja recapitularea altei fișe, așa că nu s-a salvat nimic; trimite din nou cu unreviewIdnou.409 REVIEW_STALE: momentul recapitulării salvat pentru fișă este egal cu ora curentă a serverului sau ulterior acesteia; recapitulează altă fișă.400 REVIEW_INPUT_INVALID: un argument lipsește, este invalid sau nu este acceptat, inclusivtagscombinat cudeckIdsau o etichetă pe care spațiul de lucru nu o folosește.
Exemplu de trimitere:
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-uri pentru utilizatori umani și sincronizare
Nibomo include și API-uri separate pentru clienții folosiți de oameni și pentru sincronizarea offline-first, dar acestea nu sunt contractul principal pentru agenții externi:
- fluxurile din browser folosesc cookie-uri pe domeniul comun plus protecție CSRF
- clienții offline-first folosesc rutele de sincronizare implementate în
/v1/workspaces/{workspaceId}/sync/pushși/v1/workspaces/{workspaceId}/sync/pull - rutele de sincronizare sunt separate de interfața pentru agenți externi