The practice questions of a content, held by its memocards or by the content itself. The API creates four types: free text (free_text), true or false (true_false), single choice (single_choice) and multiple choice (multiple_choice).
Fields by type
| Type | Fields to send |
|---|---|
free_text | correctAnswer: the expected answer |
true_false | correctAnswer: true or false |
single_choice | choices (2 to 10) and correctAnswer, one of the choices |
multiple_choice | choices (2 to 10) and correctAnswers, several choices |
Good to know
- An existing question can change its prompt, explanation, difficulty and points; to change its type or answers, create it again.
- Only the owner of a question updates or deletes it.
- To generate a content’s questions with AI, see AI generations.
The Question object
A practice question.
| Field | Type | Description |
|---|---|---|
id | string (uuid) | Question identifier (UUID). |
contentId | string | null | Content the question belongs to. |
memocardId | string | null | Parent memocard, or null for a question held directly by the content. |
type | string | Question type: free_text, true_false, single_choice, multiple_choice, short_answer, numeric, fill_in_blank, matching, ordering, categorization, table_completion, image_occlusion. New types may appear. |
prompt | string | null | The question asked. |
choices | string[] | null | Choices of a single_choice or multiple_choice question; null for the other types. |
correctAnswer | string | null | Expected answer (true/false for true_false); null for multiple_choice. |
correctAnswers | string[] | null | Expected answers of a multiple_choice question; null for the other types. |
explanation | string | null | Explanation shown after answering, or null. |
difficulty | string | null | Difficulty (easy, medium, hard), or null. |
points | number | null | Points of the question, or null. |
tags | string[] | Tags (empty when none). |
createdAt | string (date-time) | null | Creation instant (ISO 8601, UTC). |
updatedAt | string (date-time) | null | Last update instant (ISO 8601, UTC). |
{
"id": "e1d2c3b4-a5f6-4789-8abc-def012345678",
"contentId": "3f1c2b0e-8d4a-4f7e-9a51-3c2d1e0f9b87",
"memocardId": null,
"type": "single_choice",
"prompt": "Which pigment absorbs light during photosynthesis?",
"choices": [
"Chlorophyll",
"Haemoglobin",
"Keratin"
],
"correctAnswer": "Chlorophyll",
"correctAnswers": null,
"explanation": "Chlorophyll absorbs mostly blue and red light.",
"difficulty": "easy",
"points": 1,
"tags": [],
"createdAt": "2026-10-01T14:10:00.000Z",
"updatedAt": "2026-10-01T14:10:00.000Z"
}List the questions of a content
/v1/contents/{contentId}/questionsScope questions:readQuestions of the content (held by its memocards or by the content itself), in its order, paginated.
Parameters
| Field | In | Type | Description |
|---|---|---|---|
contentIdrequired | path | string (uuid) | Content identifier (UUID). |
limit | query | integerfrom 1 to 100 · default 20 | Number of items per page, 1 to 100 (default 20). |
cursor | query | stringat most 200 characters | Opaque cursor: the nextCursor of the previous page. Keep the same limit from one page to the next. |
Response 200
A page of questions — A page of Question { data, nextCursor, hasMore }
Errors
| HTTP | Meaning |
|---|---|
400 | validation_error or invalid_cursor |
401 | invalid_api_key or revoked_api_key |
403 | insufficient_scope, account_suspended, live_not_enabled or forbidden |
404 | not_found — the content does not exist or is not visible to this key |
406 | not_acceptable — the Accept header excludes application/json |
429 | rate_limited or test_quota_exceeded — see the Retry-After and RateLimit-* headers |
500 | internal_error |
503 | unavailable — see the Retry-After header |
curl "https://api.memojin.com/v1/contents/3f1c2b0e-8d4a-4f7e-9a51-3c2d1e0f9b87/questions?limit=20" \
-H "Authorization: Bearer $MEMOJIN_API_KEY"{
"data": [
{
"id": "e1d2c3b4-a5f6-4789-8abc-def012345678",
"contentId": "3f1c2b0e-8d4a-4f7e-9a51-3c2d1e0f9b87",
"memocardId": null,
"type": "single_choice",
"prompt": "Which pigment absorbs light during photosynthesis?",
"choices": [
"Chlorophyll",
"Haemoglobin",
"Keratin"
],
"correctAnswer": "Chlorophyll",
"correctAnswers": null,
"explanation": "Chlorophyll absorbs mostly blue and red light.",
"difficulty": "easy",
"points": 1,
"tags": [],
"createdAt": "2026-10-01T14:10:00.000Z",
"updatedAt": "2026-10-01T14:10:00.000Z"
}
],
"nextCursor": null,
"hasMore": false
}Create a question
/v1/contents/{contentId}/questionsScope questions:writeAdds a question held by the content. Types: free_text (correctAnswer), true_false (correctAnswer: true or false), single_choice (choices + correctAnswer), multiple_choice (choices + correctAnswers). Answers 201 with the question and its Location.
Parameters
| Field | In | Type | Description |
|---|---|---|---|
contentIdrequired | path | string (uuid) | Content identifier (UUID). |
Idempotency-Key | header | string | Strongly recommended. A unique value per operation (UUID v4), reused unchanged on every retry. Within 24 hours, the same key and the same request replay the first response (Idempotent-Replayed: true) without a second effect or charge; another request with the same key → 422 idempotency_key_reused; still running → 409 idempotency_in_progress. |
Request body CreateQuestionRequest
A new question held by the content.
| Field | Type | Description |
|---|---|---|
typerequired | "free_text" | "true_false" | "single_choice" | "multiple_choice" | Type of the question. The API creates free_text, true_false, single_choice and multiple_choice questions. |
promptrequired | string1 to 2000 characters | The question asked (1 to 2,000 characters). |
choices | string[]2 to 10 items | single_choice and multiple_choice: 2 to 10 choices. |
correctAnswer | string1 to 2000 characters | free_text: the expected answer; true_false: true or false; single_choice: one of choices. |
correctAnswers | string[]at least 1 item | multiple_choice: the expected choices (each one of choices). |
explanation | string | nullat most 5000 characters | Explanation shown after answering. |
difficulty | "easy" | "medium" | "hard" | Difficulty: easy, medium or hard. |
points | integerfrom 1 to 100 | Points (default 1). |
Response 201
The question created — A Question object
Errors
| HTTP | Meaning |
|---|---|
400 | validation_error or bad_request |
401 | invalid_api_key or revoked_api_key |
403 | insufficient_scope, account_suspended, live_not_enabled or forbidden |
404 | not_found — the content does not exist or is not visible to this key |
406 | not_acceptable — the Accept header excludes application/json |
409 | idempotency_in_progress — retry after Retry-After (1 s) |
413 | payload_too_large |
415 | unsupported_media_type |
422 | idempotency_key_reused, or a business rule (see the description) |
429 | rate_limited or test_quota_exceeded — see the Retry-After and RateLimit-* headers |
500 | internal_error |
503 | unavailable — see the Retry-After header |
curl -X POST "https://api.memojin.com/v1/contents/3f1c2b0e-8d4a-4f7e-9a51-3c2d1e0f9b87/questions" \
-H "Authorization: Bearer $MEMOJIN_API_KEY" \
-H "Idempotency-Key: 6f1c2b0e-8d4a-4f7e-9a51-3c2d1e0f9b87" \
-H "Content-Type: application/json" \
-d '{
"type": "single_choice",
"prompt": "Which pigment absorbs light during photosynthesis?",
"choices": [
"Chlorophyll",
"Haemoglobin",
"Keratin"
],
"correctAnswer": "Chlorophyll",
"explanation": "Chlorophyll absorbs mostly blue and red light."
}'{
"id": "e1d2c3b4-a5f6-4789-8abc-def012345678",
"contentId": "3f1c2b0e-8d4a-4f7e-9a51-3c2d1e0f9b87",
"memocardId": null,
"type": "single_choice",
"prompt": "Which pigment absorbs light during photosynthesis?",
"choices": [
"Chlorophyll",
"Haemoglobin",
"Keratin"
],
"correctAnswer": "Chlorophyll",
"correctAnswers": null,
"explanation": "Chlorophyll absorbs mostly blue and red light.",
"difficulty": "easy",
"points": 1,
"tags": [],
"createdAt": "2026-10-01T14:10:00.000Z",
"updatedAt": "2026-10-01T14:10:00.000Z"
}Retrieve a question
/v1/questions/{questionId}Scope questions:readOne question visible to the account the API key acts for. Answers 304 to a matching If-None-Match.
Parameters
| Field | In | Type | Description |
|---|---|---|---|
questionIdrequired | path | string (uuid) | Question identifier (UUID). |
Response 200
The question — A Question object
Errors
| HTTP | Meaning |
|---|---|
400 | validation_error — an identifier is not a UUID |
401 | invalid_api_key or revoked_api_key |
403 | insufficient_scope, account_suspended, live_not_enabled or forbidden |
404 | not_found |
406 | not_acceptable — the Accept header excludes application/json |
429 | rate_limited or test_quota_exceeded — see the Retry-After and RateLimit-* headers |
500 | internal_error |
503 | unavailable — see the Retry-After header |
curl "https://api.memojin.com/v1/questions/e1d2c3b4-a5f6-4789-8abc-def012345678" \
-H "Authorization: Bearer $MEMOJIN_API_KEY"{
"id": "e1d2c3b4-a5f6-4789-8abc-def012345678",
"contentId": "3f1c2b0e-8d4a-4f7e-9a51-3c2d1e0f9b87",
"memocardId": null,
"type": "single_choice",
"prompt": "Which pigment absorbs light during photosynthesis?",
"choices": [
"Chlorophyll",
"Haemoglobin",
"Keratin"
],
"correctAnswer": "Chlorophyll",
"correctAnswers": null,
"explanation": "Chlorophyll absorbs mostly blue and red light.",
"difficulty": "easy",
"points": 1,
"tags": [],
"createdAt": "2026-10-01T14:10:00.000Z",
"updatedAt": "2026-10-01T14:10:00.000Z"
}Update a question
/v1/questions/{questionId}Scope questions:writeChanges the question text, the explanation, the difficulty or the points. Owner only.
Parameters
| Field | In | Type | Description |
|---|---|---|---|
questionIdrequired | path | string (uuid) | Question identifier (UUID). |
Request body UpdateQuestionRequest
The fields to change; the others stay as they are. Answers and choices change in the app (their shape depends on the type).
| Field | Type | Description |
|---|---|---|
prompt | string1 to 2000 characters | New question text. |
explanation | string | nullat most 5000 characters | New explanation, or null to clear it. |
difficulty | "easy" | "medium" | "hard" | Difficulty: easy, medium or hard. |
points | integerfrom 1 to 100 | New points. |
Response 200
The question updated — A Question object
Errors
| HTTP | Meaning |
|---|---|
400 | validation_error or bad_request |
401 | invalid_api_key or revoked_api_key |
403 | insufficient_scope, account_suspended, live_not_enabled or forbidden |
404 | not_found |
406 | not_acceptable — the Accept header excludes application/json |
412 | precondition_failed — If-Match does not match the current ETag |
413 | payload_too_large |
415 | unsupported_media_type |
429 | rate_limited or test_quota_exceeded — see the Retry-After and RateLimit-* headers |
500 | internal_error |
503 | unavailable — see the Retry-After header |
curl -X PATCH "https://api.memojin.com/v1/questions/e1d2c3b4-a5f6-4789-8abc-def012345678" \
-H "Authorization: Bearer $MEMOJIN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"prompt": "Which pigment absorbs most of the light?"
}'{
"id": "e1d2c3b4-a5f6-4789-8abc-def012345678",
"contentId": "3f1c2b0e-8d4a-4f7e-9a51-3c2d1e0f9b87",
"memocardId": null,
"type": "single_choice",
"prompt": "Which pigment absorbs light during photosynthesis?",
"choices": [
"Chlorophyll",
"Haemoglobin",
"Keratin"
],
"correctAnswer": "Chlorophyll",
"correctAnswers": null,
"explanation": "Chlorophyll absorbs mostly blue and red light.",
"difficulty": "easy",
"points": 1,
"tags": [],
"createdAt": "2026-10-01T14:10:00.000Z",
"updatedAt": "2026-10-01T14:10:00.000Z"
}Delete a question
/v1/questions/{questionId}Scope questions:writeDeletes the question. Owner only. Answers 204 without a body.
Parameters
| Field | In | Type | Description |
|---|---|---|---|
questionIdrequired | path | string (uuid) | Question identifier (UUID). |
Response 204
Deleted — No response body.
Errors
| HTTP | Meaning |
|---|---|
400 | validation_error — an identifier is not a UUID |
401 | invalid_api_key or revoked_api_key |
403 | insufficient_scope, account_suspended, live_not_enabled or forbidden |
404 | not_found |
406 | not_acceptable — the Accept header excludes application/json |
412 | precondition_failed — If-Match does not match the current ETag |
429 | rate_limited or test_quota_exceeded — see the Retry-After and RateLimit-* headers |
500 | internal_error |
503 | unavailable — see the Retry-After header |
curl -X DELETE "https://api.memojin.com/v1/questions/e1d2c3b4-a5f6-4789-8abc-def012345678" \
-H "Authorization: Bearer $MEMOJIN_API_KEY"