Referencia de API
Descripción general
Esta página documenta el contrato actual de agente de IA externo para Nibomo.
Si su cliente habla MCP, el conector MCP es la forma más simple de conectarse y envuelve esta misma superficie de datos. Esta página documenta el contrato HTTP de descubrimiento, SQL, guías y repaso que usan los agentes de CLI.
Comience desde el punto de entrada del descubrimiento canónico:
GET https://api.flashcards-open-source-app.com/v1/
La misma carga útil de descubrimiento también está disponible en GET /v1/agent, pero /v1/ es el punto de entrada público principal.
La respuesta de descubrimiento le dice al agente cómo:
- iniciar sesión OTP por correo electrónico
- intercambiar la OTP por una clave API de larga duración
- cargar el contexto de la cuenta
- crear o seleccionar un espacio de trabajo
- continuar a través de la superficie SQL publicada
- obtener guías de referencia y repasar tarjetas de una en una
Descubrimiento en tiempo de ejecución y código fuente
OpenAPI no está disponible. Las cuatro URL de especificación anteriores que aparecen a continuación ahora devuelven el mismo aviso de descubrimiento JSON con "openapiAvailable": false en lugar de un esquema:
https://api.flashcards-open-source-app.com/v1/agent/openapi.jsonhttps://api.flashcards-open-source-app.com/v1/agent/swagger.jsonhttps://api.flashcards-open-source-app.com/v1/openapi.jsonhttps://api.flashcards-open-source-app.com/v1/swagger.json
Utilice GET https://api.flashcards-open-source-app.com/v1/ para el descubrimiento actual en tiempo de ejecución. Siga el docs.discoveryUrl devuelto para las rutas en tiempo de ejecución y docs.source.agentRoutesUrl para los detalles de implementación.
Arranque de autenticación
El arranque OTP se ejecuta en el servicio de autenticación:
POST https://auth.flashcards-open-source-app.com/api/agent/send-codePOST https://auth.flashcards-open-source-app.com/api/agent/verify-code
El flujo es:
- Llama a
GET /v1/. - Envíe el correo electrónico del usuario a
send-code. - Lea
otpSessionTokende la respuesta. - Solicite al usuario el último código de correo electrónico de 8 dígitos.
- Llame a
verify-codeconcode,otpSessionTokenylabel. - Conserve la clave API devuelta fuera de la memoria del chat.
Variable de entorno recomendada:
export FLASHCARDS_OPEN_SOURCE_API_KEY="fca_ABCDEFGH_0123456789ABCDEFGHJKMNPQRS"
Las solicitudes autenticadas utilizan:
Authorization: ApiKey <key>
Secuencia de arranque de ejemplo:
curl https://api.flashcards-open-source-app.com/v1/
curl -X POST https://auth.flashcards-open-source-app.com/api/agent/send-code \
-H "Content-Type: application/json" \
-d '{"email":"you@example.com"}'
curl -X POST https://auth.flashcards-open-source-app.com/api/agent/verify-code \
-H "Content-Type: application/json" \
-d '{
"code":"12345678",
"otpSessionToken":"...",
"label":"Codex on MacBook"
}'
Superficie del agente posterior al inicio de sesión
Después de la verificación, la superficie actual del agente es:
GET /v1/agent/meGET /v1/agent/workspacesPOST /v1/agent/workspacesPOST /v1/agent/workspaces/{workspaceId}/selectPOST /v1/agent/sql/query(solo lectura)POST /v1/agent/sql/execute(escritura)GET /v1/agent/guide/{topic}(solo lectura)POST /v1/agent/reviews/next(solo lectura)POST /v1/agent/reviews/reveal(solo lectura)POST /v1/agent/reviews/submit(escritura)
El bootstrap típico se ve así:
GET /v1/agent/meGET /v1/agent/workspaces?limit=100- Si es necesario,
POST /v1/agent/workspacescon{"name":"Personal"} - Si es necesario,
POST /v1/agent/workspaces/{workspaceId}/select - Utilice
POST /v1/agent/sql/querypara lecturas yPOST /v1/agent/sql/executepara escrituras
La selección del espacio de trabajo es explícita por conexión de clave API. Los agentes deben seguir el texto instructions devuelto y docs.discoveryUrl para las rutas en tiempo de ejecución, además de docs.source.agentRoutesUrl para los detalles de implementación, en lugar de adivinar el siguiente paso.
Las rutas SQL y de repaso también aceptan un workspaceId opcional en el cuerpo JSON. Este apunta a ese espacio de trabajo durante una llamada sin cambiar la selección; omítalo para usar el espacio de trabajo seleccionado. Si no hay ni una selección ni un workspaceId, responden 409 WORKSPACE_SELECTION_REQUIRED.
Superficie SQL
POST /v1/agent/sql/query es la superficie estrictamente de solo lectura (SHOW TABLES, DESCRIBE, SHOW COLUMNS, SELECT) y POST /v1/agent/sql/execute es la superficie de escritura (INSERT, UPDATE, DELETE); una sola llamada debe ser totalmente de lectura o totalmente de escritura.
Está intencionalmente limitado y no es PostgreSQL completo. Esta documentación cubre solo el dialecto compatible, no una referencia de compatibilidad con PostgreSQL.
Ninguna ruta de lectura repara datos, recalcula la programación ni cambia el
estado de las tarjetas. Use POST /v1/agent/sql/execute para toda escritura de
tarjetas y mazos. SQL no puede escribir review_events ni el estado de
programación FSRS; registre los repasos mediante
POST /v1/agent/reviews/submit.
Familias de declaraciones actuales:
SHOW TABLESDESCRIBE <resource>SHOW COLUMNS FROM <resource>SELECTINSERTUPDATEDELETE
Los recursos lógicos publicados actualmente incluyen:
workspacecardsdecksreview_events
Notas:
LIMITpor defecto es100y tiene un límite de100- use
ORDER BYcuando necesite una paginación estable - utilice
SHOW TABLESoDESCRIBE cardspara el descubrimiento de esquemas - cada llamada SQL tiene el alcance de un espacio de trabajo: el
workspaceIddel cuerpo o el espacio de trabajo seleccionado
Solicitud de ejemplo:
curl -X POST https://api.flashcards-open-source-app.com/v1/agent/sql/query \
-H "Content-Type: application/json" \
-H "Authorization: ApiKey $FLASHCARDS_OPEN_SOURCE_API_KEY" \
-d '{"sql":"SHOW TABLES"}'
Ejemplo de consulta de tarjeta:
curl -X POST https://api.flashcards-open-source-app.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"
}'
Mutación de ejemplo:
curl -X POST https://api.flashcards-open-source-app.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'\''"
}'
También hay disponible un servidor MCP remoto en https://mcp.nibomo.com/mcp que usa OAuth 2.1 (Dynamic Client Registration + PKCE). Expone la misma división SQL como sql_query (estrictamente de solo lectura) y sql_execute (escritura), además de list_workspaces, get_guide y las herramientas de repaso next_review_card, reveal_answer y submit_review; consulte el conector MCP.
Seguridad y alcance
La superficie SQL es un dialecto contenido y validado por el analizador, no PostgreSQL en bruto. Las protecciones son:
- Lista de instrucciones cerrada: solo
SHOW TABLES,DESCRIBE,SHOW COLUMNSySELECTpara lecturas, eINSERT,UPDATEyDELETEpara escrituras. Cualquier otra cosa se rechaza en el análisis. - Recursos limitados: las instrucciones solo pueden tocar los recursos
workspace,cards,decksyreview_events. - Alcance por espacio de trabajo: cada instrucción tiene el alcance de un espacio de trabajo al que puede acceder, ya sea el
workspaceIddel cuerpo de la solicitud o su espacio de trabajo seleccionado, sin acceso entre inquilinos. - Cuerpos de solicitud estrictos: las rutas SQL y de repaso rechazan un campo desconocido en el cuerpo, por lo que un
workspaceIdmal escrito falla en lugar de ejecutarse contra el espacio de trabajo seleccionado. - Límites: hasta
100filas por instrucción, hasta50instrucciones por lote y un límite de resultados de aproximadamente12ktokens. Los lotes de mutación se aplican de forma atómica. - División de lectura/escritura:
sql_queryylist_workspacesson estrictamente de solo lectura (readOnlyHint) y nunca reparan datos, recalculan la programación ni cambian el estado de las tarjetas.sql_executees la única herramienta SQL de escritura y realiza escrituras (destructiveHint); una sola llamada debe ser totalmente de lectura o totalmente de escritura. SQL no puede escribirreview_eventsni el estado de programación FSRS; soloPOST /v1/agent/reviews/submit(MCPsubmit_review) registra un repaso.
Guías
GET /v1/agent/guide/{topic} devuelve una guía de referencia en data.guide, el mismo cuerpo que sirve la herramienta MCP get_guide. Temas:
sql_dialect: la gramática SQL completa, los límites y ejemploscard_authoring: el contrato de la tarjeta, las etiquetas, las comprobaciones de duplicados y el formatobulk_authoring: dividir y verificar un trabajo de escritura grandereview_flow: el ciclo de repaso y calificación
Un tema desconocido responde 400 con la lista de temas compatibles. Obtenga la guía correspondiente antes de crear tarjetas, escribir en bloque o hacer un repaso, y vuelva a leer sql_dialect después de una instrucción rechazada.
curl https://api.flashcards-open-source-app.com/v1/agent/guide/sql_dialect \
-H "Authorization: ApiKey $FLASHCARDS_OPEN_SOURCE_API_KEY"
Repasos
Las rutas de repaso permiten a un agente preguntar a un estudiante una tarjeta a la vez y guardar cada calificación en la programación FSRS de la tarjeta. Reciben los mismos argumentos JSON que las herramientas de repaso de MCP:
POST /v1/agent/reviews/nextdevuelvecardconcardIdyfrontText, ocard: nullcuando no hay nada pendiente. Opcionalmente,tags(cualquiera de ellas) odeckIdacota la cola, nunca ambos; una solicitud sin cuerpo es válida.POST /v1/agent/reviews/revealrequierecardIdy devuelve elbackTextde esa tarjeta.POST /v1/agent/reviews/submitrequierecardId, un UUIDreviewIdgenerado por el cliente, unratingdeAgain,Hard,GoodoEasy, y elreviewedTimeZoneIANA del estudiante. El servidor asigna la hora del repaso y devuelve la nueva programación de la tarjeta, incluidosdueAt,state,repsylapses.
Las tres rutas aceptan el workspaceId opcional. Conserve el reviewId antes de enviar y reintente un envío incierto con la solicitud idéntica; nunca registra un segundo repaso. Las rutas de repaso también pueden responder:
409 REVIEW_EVENT_CONFLICT: el repaso ya se había registrado, yerror.details.reviewSchedulecontiene la programación actual de la tarjeta.409 REVIEW_ID_CARD_MISMATCH: elreviewIdya identifica un repaso de otra tarjeta, por lo que no se guardó nada; envíe de nuevo con un nuevoreviewId.409 REVIEW_STALE: la hora de repaso almacenada de la tarjeta es igual o posterior a la hora actual del servidor; repase otra tarjeta.400 REVIEW_INPUT_INVALID: un argumento falta, no es válido o no se admite, incluidotagscombinado condeckIdo una etiqueta que el espacio de trabajo no usa.
Envío de ejemplo:
curl -X POST https://api.flashcards-open-source-app.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 humanas y de sincronización
Nibomo también incluye API independientes para clientes humanos y sincronización sin conexión, pero no son el contrato principal para agentes externos:
- los flujos del navegador utilizan cookies de dominio compartido más protección CSRF
- Los primeros clientes sin conexión utilizan rutas de sincronización implementadas en
/v1/workspaces/{workspaceId}/sync/pushy/v1/workspaces/{workspaceId}/sync/pull - las rutas de sincronización están separadas de la superficie del agente externo