API-referentie
Overzicht
Deze pagina beschrijft het huidige contract voor externe AI-agents van Nibomo.
Spreekt je client MCP, dan is de MCP-connector de eenvoudigste manier om te verbinden en biedt toegang tot dezelfde data-interface. Deze pagina beschrijft het HTTP-contract voor discovery, SQL, naslaggidsen en herhalingen dat CLI-agents gebruiken.
Begin bij het canonieke discovery-startpunt:
GET https://api.nibomo.com/v1/
Dezelfde discovery-payload is ook beschikbaar via GET /v1/agent, maar /v1/ is het primaire openbare startpunt.
Het discovery-antwoord vertelt een agent hoe hij:
- het aanmelden met een OTP per e-mail start
- de OTP inwisselt voor een langdurig geldige API-sleutel
- de accountcontext laadt
- een werkruimte aanmaakt of selecteert
- verdergaat via de gepubliceerde SQL-interface
- naslaggidsen ophaalt en kaarten één voor één herhaalt
Runtime-discovery en broncode
OpenAPI is niet beschikbaar. De vier voormalige specificatie-URL's hieronder geven nu dezelfde JSON-discoverymelding met "openapiAvailable": false terug in plaats van een schema:
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
Gebruik GET https://api.nibomo.com/v1/ voor de actuele runtime-discovery. Volg de teruggegeven docs.discoveryUrl voor runtime-routes en docs.source.agentRoutesUrl voor implementatiedetails.
Authenticatie-bootstrap
De OTP-bootstrap draait op de authenticatiedienst:
POST https://auth.nibomo.com/api/agent/send-codePOST https://auth.nibomo.com/api/agent/verify-code
Het verloop is:
- Roep
GET /v1/aan. - Stuur het e-mailadres van de gebruiker naar
send-code. - Lees
otpSessionTokenuit het antwoord. - Vraag de gebruiker om de meest recente 8-cijferige code uit de e-mail.
- Roep
verify-codeaan metcode,otpSessionTokenenlabel. - Bewaar de teruggegeven API-sleutel buiten het chatgeheugen.
Aanbevolen omgevingsvariabele:
export FLASHCARDS_OPEN_SOURCE_API_KEY="fca_ABCDEFGH_0123456789ABCDEFGHJKMNPQRS"
Geauthenticeerde verzoeken gebruiken:
Authorization: ApiKey <key>
Voorbeeld van een bootstrapreeks:
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"
}'
Agent-interface na het aanmelden
Na de verificatie bestaat de huidige agent-interface uit:
GET /v1/agent/meGET /v1/agent/workspacesPOST /v1/agent/workspacesPOST /v1/agent/workspaces/{workspaceId}/selectPOST /v1/agent/sql/query(alleen lezen)POST /v1/agent/sql/execute(schrijven)GET /v1/agent/guide/{topic}(alleen lezen)POST /v1/agent/reviews/next(alleen lezen)POST /v1/agent/reviews/reveal(alleen lezen)POST /v1/agent/reviews/submit(schrijven)
Een typische bootstrap ziet er zo uit:
GET /v1/agent/meGET /v1/agent/workspaces?limit=100- Indien nodig
POST /v1/agent/workspacesmet{"name":"Personal"} - Indien nodig
POST /v1/agent/workspaces/{workspaceId}/select - Gebruik
POST /v1/agent/sql/queryom te lezen enPOST /v1/agent/sql/executeom te schrijven
De werkruimte wordt per API-sleutelverbinding expliciet geselecteerd. Agents moeten de teruggegeven instructions-tekst en docs.discoveryUrl volgen voor runtime-routes, plus docs.source.agentRoutesUrl voor implementatiedetails, in plaats van de volgende stap te raden.
De SQL- en herhaalroutes accepteren ook een optionele workspaceId in de JSON-body. Daarmee richt je één aanroep op die werkruimte zonder de selectie te wijzigen; laat hem weg om de geselecteerde werkruimte te gebruiken. Zonder selectie en zonder workspaceId antwoorden ze met 409 WORKSPACE_SELECTION_REQUIRED.
SQL-interface
POST /v1/agent/sql/query is de strikt alleen-lezen interface (SHOW TABLES, DESCRIBE, SHOW COLUMNS, SELECT) en POST /v1/agent/sql/execute is de schrijfinterface (INSERT, UPDATE, DELETE); één aanroep moet volledig uit leesopdrachten of volledig uit schrijfopdrachten bestaan.
De interface is bewust beperkt en is niet volledig PostgreSQL. Deze documentatie beschrijft alleen het ondersteunde dialect en is geen referentie voor compatibiliteit met PostgreSQL.
Geen enkel leespad repareert data, berekent de planning opnieuw of wijzigt de status van een kaart. Gebruik
POST /v1/agent/sql/execute voor elke schrijfactie op kaarten en decks. SQL kan niet schrijven naar
review_events of de FSRS-planningsstatus; leg herhalingen vast via
POST /v1/agent/reviews/submit.
Huidige soorten statements:
SHOW TABLESDESCRIBE <resource>SHOW COLUMNS FROM <resource>SELECTINSERTUPDATEDELETE
Gepubliceerde logische resources zijn op dit moment onder meer:
workspacecardsdecksreview_events
Opmerkingen:
LIMITis standaard100en maximaal100- gebruik
ORDER BYals je stabiele paginering nodig hebt - gebruik
SHOW TABLESofDESCRIBE cardsom het schema te verkennen - elke SQL-aanroep is beperkt tot één werkruimte: de
workspaceIdin de body of de geselecteerde werkruimte
Voorbeeldverzoek:
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"}'
Voorbeeld van een kaartquery:
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"
}'
Voorbeeld van een wijziging:
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'\''"
}'
Er is ook een externe MCP-server beschikbaar op https://mcp.nibomo.com/mcp met OAuth 2.1 (Dynamic Client Registration + PKCE). Die biedt dezelfde SQL-splitsing als sql_query (strikt alleen lezen) en sql_execute (schrijven), plus list_workspaces, get_guide en de herhaaltools next_review_card, reveal_answer en submit_review; zie de MCP-connector.
Veiligheid en reikwijdte
De SQL-interface is een afgebakend dialect dat door een parser wordt afgedwongen, geen kale PostgreSQL. De waarborgen zijn:
- Gesloten allowlist van statements: alleen
SHOW TABLES,DESCRIBE,SHOW COLUMNSenSELECTom te lezen, enINSERT,UPDATEenDELETEom te schrijven. Al het andere wordt bij het parsen geweigerd. - Beperkte resources: statements kunnen alleen de resources
workspace,cards,decksenreview_eventsaanraken. - Afbakening per werkruimte: elk statement is beperkt tot één werkruimte waartoe je toegang hebt, ofwel de
workspaceIdin de body van het verzoek, ofwel je geselecteerde werkruimte, zonder toegang tussen tenants. - Strikte request-bodies: de SQL- en herhaalroutes weigeren een onbekend veld in de body, zodat een verkeerd gespelde
workspaceIdeen fout geeft in plaats van op de geselecteerde werkruimte te worden uitgevoerd. - Limieten: maximaal
100rijen per statement, maximaal50statements per batch en een resultaatlimiet van ongeveer12ktokens. Batches met wijzigingen worden atomair toegepast. - Scheiding tussen lezen en schrijven:
sql_queryenlist_workspaceszijn strikt alleen-lezen (readOnlyHint) en repareren nooit data, berekenen de planning nooit opnieuw en wijzigen nooit de status van een kaart.sql_executeis de enige SQL-schrijftool en voert de schrijfacties uit (destructiveHint); één aanroep moet volledig uit leesopdrachten of volledig uit schrijfopdrachten bestaan. SQL kan niet schrijven naarreview_eventsof de FSRS-planningsstatus; alleenPOST /v1/agent/reviews/submit(MCPsubmit_review) legt een herhaling vast.
Naslaggidsen
GET /v1/agent/guide/{topic} geeft één naslaggids terug in data.guide, dezelfde inhoud die de MCP-tool get_guide levert. Onderwerpen:
sql_dialect: de volledige SQL-grammatica, limieten en voorbeeldencard_authoring: het kaartcontract, tags, controles op duplicaten en opmaakbulk_authoring: een grote schrijfopdracht opsplitsen en controlerenreview_flow: de cyclus van herhalen en beoordelen
Een onbekend onderwerp geeft 400 terug met de lijst van ondersteunde onderwerpen. Haal de bijbehorende naslaggids op voordat je kaarten opstelt, in bulk schrijft of een herhaling uitvoert, en lees sql_dialect opnieuw na een geweigerd statement.
curl https://api.nibomo.com/v1/agent/guide/sql_dialect \
-H "Authorization: ApiKey $FLASHCARDS_OPEN_SOURCE_API_KEY"
Herhalingen
Met de herhaalroutes kan een agent een leerder kaart voor kaart overhoren en elke beoordeling opslaan in het FSRS-schema van de kaart. Ze accepteren dezelfde JSON-argumenten als de MCP-herhaaltools:
POST /v1/agent/reviews/nextgeeftcardterug metcardIdenfrontText, ofcard: nullals er niets aan de beurt is. Met het optioneletags(minstens één van de tags) ofdeckIdbeperk je de wachtrij, nooit met beide tegelijk; een verzoek zonder body is geldig.POST /v1/agent/reviews/revealvereistcardIden geeft debackTextvan die kaart terug.POST /v1/agent/reviews/submitvereistcardId, een door de client gegenereerdereviewId-UUID, eenratingvanAgain,Hard,GoodofEasy, en de IANA-reviewedTimeZonevan de leerder. De server legt het tijdstip van de herhaling vast en geeft het nieuwe schema van de kaart terug, inclusiefdueAt,state,repsenlapses.
Alle drie de routes accepteren de optionele workspaceId. Bewaar de reviewId voordat je indient, en verstuur een indiening waarvan de uitkomst onzeker is opnieuw met exact hetzelfde verzoek; er wordt nooit een tweede herhaling vastgelegd. De herhaalroutes kunnen ook een van deze antwoorden geven:
409 REVIEW_EVENT_CONFLICT: de herhaling was al vastgelegd, enerror.details.reviewSchedulebevat het huidige schema van de kaart.409 REVIEW_ID_CARD_MISMATCH: dereviewIdhoort al bij een herhaling van een andere kaart, dus er is niets opgeslagen; dien opnieuw in met een nieuwereviewId.409 REVIEW_STALE: het opgeslagen herhaaltijdstip van de kaart ligt op of na de huidige servertijd; herhaal een andere kaart.400 REVIEW_INPUT_INVALID: een argument ontbreekt, is ongeldig of wordt niet ondersteund, waarondertagsin combinatie metdeckIdof een tag die de werkruimte niet gebruikt.
Voorbeeld van een indiening:
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's voor mensen en synchronisatie
Nibomo heeft ook aparte API's voor clients die door mensen worden gebruikt en voor offline-first synchronisatie, maar die vormen niet het hoofdcontract voor externe agents:
- browserflows gebruiken cookies op het gedeelde domein plus CSRF-bescherming
- offline-first clients gebruiken de geïmplementeerde synchronisatieroutes onder
/v1/workspaces/{workspaceId}/sync/pushen/v1/workspaces/{workspaceId}/sync/pull - synchronisatieroutes staan los van de interface voor externe agents