Générations IA et travaux

Lancez la génération de cartes mémo ou de questions par l’IA (202 Accepted), suivez le travail avec GET /v1/jobs, estimez les crédits consommés.

api.memojin.com/v1 · Contrat 1.0.0-beta.2 · Bêta

Sections · Générations IA et travaux

L’IA de Memojin génère des cartes mémo à partir du texte d’un contenu, puis des questions à partir de ses cartes. Une génération est asynchrone : l’API répond aussitôt 202 Accepted avec un travail, que vous suivez avec GET /v1/jobs/{jobId}.

Déroulement

  1. Lancez la génération : 202, avec jobId et l’estimation des crédits IA (estimate.units, en-tête Memojin-Credits-Estimate).
  2. Interrogez le travail toutes les 5 secondes environ : pending, puis running (avec progress de 0 à 100).
  3. À succeeded, listez les cartes ou les questions du contenu. À failed (error: "generation_failed") ou cancelled, rien n’est à lire ; citez l’identifiant du travail si vous nous écrivez.

La boucle complète

import os, time, uuid, requests

API = "https://api.memojin.com/v1"
H = {"Authorization": f"Bearer {os.environ['MEMOJIN_API_KEY']}"}

# 1. Start the generation: 202 Accepted
job = requests.post(
    f"{API}/contents/{content_id}/memocard-generations",
    headers={**H, "Idempotency-Key": str(uuid.uuid4())},
    timeout=30,
)
job.raise_for_status()
job = job.json()  # {"jobId": ..., "status": "pending", "estimate": {"operation": "ai_card", "units": 12}}

# 2. Poll the job every 5 seconds until it is finished
while True:
    state = requests.get(f"{API}/jobs/{job['jobId']}", headers=H, timeout=10).json()
    if state["status"] in ("succeeded", "failed", "cancelled"):
        break
    time.sleep(5)

# 3. Read the memocards of the content
if state["status"] == "succeeded":
    cards = requests.get(f"{API}/contents/{content_id}/memocards", params={"limit": 100}, headers=H, timeout=30).json()["data"]

Refus avant toute génération

  • 422 content_too_short : le texte du contenu fait moins de 100 caractères.
  • 422 nothing_to_generate : chaque partie du contenu a déjà ses cartes mémo.
  • 422 no_memocards : le contenu n’a pas de carte mémo d’où tirer des questions.
  • 422 all_memocards_have_questions : chaque carte a déjà ses questions.
  • 402 insufficient_credits : le compte n’a plus assez de crédits IA.

En bac à sable

Avec une clé mj_test_, la génération est simulée : travail aussitôt succeeded, aucune carte créée, aucun crédit consommé (voir bac à sable). La fin d’un travail signalée par webhook Bientôt.

L’objet GenerationAccepted

Une génération acceptée pour un traitement asynchrone.

ChampTypeDescription
jobIdtoujours présentstring (uuid)Travail à suivre avec GET /v1/jobs/{jobId}.
statustoujours présent"pending" | "succeeded"pending à l’acceptation ; succeeded aussitôt dans le bac à sable (mj_test_), où rien n’est généré.
estimatetoujours présentobjectCe que la génération prévoit de consommer (repris dans l’en-tête Memojin-Credits-Estimate).
GenerationAccepted
{
  "jobId": "9b8a7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
  "status": "pending",
  "estimate": {
    "operation": "ai_card",
    "units": 12
  }
}

L’objet Job

Un travail asynchrone (une génération IA).

ChampTypeDescription
idtoujours présentstring (uuid)Identifiant du travail (UUID).
typetoujours présentstringCe que fait le travail : memocard_generation, question_generation ou other. De nouvelles valeurs peuvent apparaître.
statustoujours présentstringpending, running, succeeded, failed ou cancelled. Interrogez jusqu’à succeeded, failed ou cancelled.
progresstoujours présentintegerde 0 à 100Avancement, de 0 à 100.
contentIdtoujours présentstring | nullContenu sur lequel porte le travail, ou null.
errortoujours présentstring | nullCode d’erreur quand le travail a échoué (generation_failed), ou null. Le détail reste interne : citez l’identifiant du travail si vous nous contactez.
createdAttoujours présentstring (date-time)Instant de création (ISO 8601, UTC).
updatedAttoujours présentstring (date-time)Instant de la dernière modification (ISO 8601, UTC).
Job
{
  "id": "9b8a7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
  "type": "memocard_generation",
  "status": "running",
  "progress": 40,
  "contentId": "3f1c2b0e-8d4a-4f7e-9a51-3c2d1e0f9b87",
  "error": null,
  "createdAt": "2026-10-04T10:00:00.000Z",
  "updatedAt": "2026-10-04T10:00:20.000Z"
}

Générer des cartes mémo à partir d’un contenu

POST/v1/contents/{contentId}/memocard-generationsScope generations:write

Génère des cartes mémo à partir des parties du corps du contenu qui n’en ont pas encore. Asynchrone : répond 202 avec un jobId à interroger par GET /v1/jobs/{jobId}. Consomme les crédits IA du compte (une unité ai_card par carte mémo, voyez estimate.units et l’en-tête Memojin-Credits-Estimate) ; 402 insufficient_credits quand ils sont épuisés. Refus métier : 422 content_too_short, 422 nothing_to_generate. Avec une clé mj_test_, rien n’est généré et aucun crédit n’est consommé.

Paramètres

ChampOùTypeDescription
contentIdobligatoirecheminstring (uuid)Identifiant du contenu (UUID).
Idempotency-Keyfacultatifen-têtestringFortement recommandée. Une valeur unique par opération (UUID v4), réutilisée telle quelle à chaque nouvelle tentative. Pendant 24 heures, la même clé et la même requête rejouent la première réponse (Idempotent-Replayed: true) sans second effet ni second débit ; une autre requête avec la même clé → 422 idempotency_key_reused ; encore en cours → 409 idempotency_in_progress.

Réponse 202

Génération acceptée — Un objet GenerationAccepted

Erreurs

HTTPSignification
400validation_error — contentId n’est pas un UUID
401invalid_api_key ou revoked_api_key
402insufficient_credits
403insufficient_scope, account_suspended, live_not_enabled ou forbidden
404not_found
406not_acceptable — l’en-tête Accept exclut application/json
409idempotency_in_progress — réessayez après Retry-After (1 s)
422idempotency_key_reused, ou une règle métier (voyez la description)
429rate_limited ou test_quota_exceeded — voyez les en-têtes Retry-After et RateLimit-*
500internal_error
503unavailable — voyez l’en-tête Retry-After
Requête
curl -X POST "https://api.memojin.com/v1/contents/3f1c2b0e-8d4a-4f7e-9a51-3c2d1e0f9b87/memocard-generations" \
  -H "Authorization: Bearer $MEMOJIN_API_KEY" \
  -H "Idempotency-Key: 6f1c2b0e-8d4a-4f7e-9a51-3c2d1e0f9b87"
Réponse 202
{
  "jobId": "9b8a7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
  "status": "pending",
  "estimate": {
    "operation": "ai_card",
    "units": 12
  }
}

Générer des questions à partir d’un contenu

POST/v1/contents/{contentId}/question-generationsScope generations:write

Génère des questions d’entraînement pour les cartes mémo du contenu qui n’en ont pas encore. Asynchrone : répond 202 avec un jobId à interroger par GET /v1/jobs/{jobId}. Consomme les crédits IA du compte (une unité ai_card par question, voyez estimate.units et l’en-tête Memojin-Credits-Estimate) ; 402 insufficient_credits quand ils sont épuisés. Refus métier : 422 no_memocards, 422 all_memocards_have_questions. Avec une clé mj_test_, rien n’est généré et aucun crédit n’est consommé.

Paramètres

ChampOùTypeDescription
contentIdobligatoirecheminstring (uuid)Identifiant du contenu (UUID).
Idempotency-Keyfacultatifen-têtestringFortement recommandée. Une valeur unique par opération (UUID v4), réutilisée telle quelle à chaque nouvelle tentative. Pendant 24 heures, la même clé et la même requête rejouent la première réponse (Idempotent-Replayed: true) sans second effet ni second débit ; une autre requête avec la même clé → 422 idempotency_key_reused ; encore en cours → 409 idempotency_in_progress.

Réponse 202

Génération acceptée — Un objet GenerationAccepted

Erreurs

HTTPSignification
400validation_error — contentId n’est pas un UUID
401invalid_api_key ou revoked_api_key
402insufficient_credits
403insufficient_scope, account_suspended, live_not_enabled ou forbidden
404not_found
406not_acceptable — l’en-tête Accept exclut application/json
409idempotency_in_progress — réessayez après Retry-After (1 s)
422idempotency_key_reused, ou une règle métier (voyez la description)
429rate_limited ou test_quota_exceeded — voyez les en-têtes Retry-After et RateLimit-*
500internal_error
503unavailable — voyez l’en-tête Retry-After
Requête
curl -X POST "https://api.memojin.com/v1/contents/3f1c2b0e-8d4a-4f7e-9a51-3c2d1e0f9b87/question-generations" \
  -H "Authorization: Bearer $MEMOJIN_API_KEY" \
  -H "Idempotency-Key: 6f1c2b0e-8d4a-4f7e-9a51-3c2d1e0f9b87"
Réponse 202
{
  "jobId": "9b8a7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
  "status": "pending",
  "estimate": {
    "operation": "ai_card",
    "units": 12
  }
}

Lire un travail

GET/v1/jobs/{jobId}Scope jobs:read

État et avancement d’une génération asynchrone. Interrogez-le toutes les quelques secondes (5 s est un bon rythme) jusqu’à ce que status vaille succeeded, failed ou cancelled ; listez ensuite les cartes mémo ou les questions du contenu.

Paramètres

ChampOùTypeDescription
jobIdobligatoirecheminstring (uuid)Identifiant du travail (UUID), tel que rendu par une génération.

Réponse 200

Le travail — Un objet Job

Erreurs

HTTPSignification
400validation_error — un identifiant n’est pas un UUID
401invalid_api_key ou revoked_api_key
403insufficient_scope, account_suspended, live_not_enabled ou forbidden
404not_found
406not_acceptable — l’en-tête Accept exclut application/json
429rate_limited ou test_quota_exceeded — voyez les en-têtes Retry-After et RateLimit-*
500internal_error
503unavailable — voyez l’en-tête Retry-After
Requête
curl "https://api.memojin.com/v1/jobs/9b8a7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d" \
  -H "Authorization: Bearer $MEMOJIN_API_KEY"
Réponse 200
{
  "id": "9b8a7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
  "type": "memocard_generation",
  "status": "running",
  "progress": 40,
  "contentId": "3f1c2b0e-8d4a-4f7e-9a51-3c2d1e0f9b87",
  "error": null,
  "createdAt": "2026-10-04T10:00:00.000Z",
  "updatedAt": "2026-10-04T10:00:20.000Z"
}