Download OpenAPI specification:
小学生向け学習・スクリーニングアプリのバックエンド API。
認可は以下のロール階層で行う:
| ロール | 範囲 |
|---|---|
system_admin |
全学校・全リソース |
school_admin |
自校全体 |
shunin (学年主任) |
自学年の全クラス |
tannin (担任) |
自クラスのみ |
student |
自分のデータのみ |
shunin と tannin は必ずクラスに所属する (担任兼務)。
すべてのエラーは共通フォーマットで返す。
{
"error": {
"code": "MACHINE_READABLE_CODE",
"message": "人間向けメッセージ",
"details": {}
}
}
JWT から解決された Actor 情報を返す。 フロントエンドは認証直後にこのエンドポイントを呼んで、表示・遷移先を決定する。
{- "role": "system_admin",
- "user_id": "string",
- "school_id": "string",
- "class_id": 0,
- "school_year": 0,
- "grade": 0,
- "email": "user@example.com",
- "family_name": "string",
- "given_name": "string"
}生徒のログイン時に呼び出す。student_status.last_login_date と login_streak を更新する。
| client_date required | string <date> クライアント端末のローカル日付 (例 "2026-05-07") |
{- "client_date": "2019-08-24"
}{- "logged_in": true,
- "login_streak": 0,
- "previous_login_date": "2019-08-24",
- "is_new_day": true
}ロールに応じたスコープで、要対応アラートを集計して返す。
スコープ (自動決定):
system_admin: 全校 (school_id クエリパラで絞り込み可)school_admin: 自校shunin: 自学年tannin: 自クラス各アラートは「件数」を返し、UI 側でバッジ等として表示。
| school_id | string system_admin が学校を指定する場合のみ |
{- "scope": {
- "type": "class",
- "school_id": "string",
- "school_name": "string",
- "class_id": 0,
- "class_name": "string",
- "grade": 0
}, - "alerts": {
- "ai_support_unreviewed": {
- "count": 0,
- "label": "string",
- "severity": "low"
}, - "teacher_support_count": {
- "count": 0,
- "label": "string",
- "severity": "low"
}, - "teacher_unreviewed_count": {
- "count": 0,
- "label": "string",
- "severity": "low"
}, - "tests_this_week": {
- "count": 0,
- "label": "string",
- "severity": "low"
}
}
}ロールに応じたスコープで、利用状況の概況メトリクスを返す。
スコープ (自動決定):
system_admin: 全校 (school_id クエリパラで絞り込み可)school_admin: 自校shunin: 自学年tannin: 自クラス| school_id | string |
| period | string Default: "last_7_days" Enum: "last_7_days" "last_30_days" "current_school_year" |
{- "scope": {
- "type": "class",
- "school_id": "string",
- "school_name": "string",
- "class_id": 0,
- "class_name": "string",
- "grade": 0
}, - "metrics": {
- "test_completion_rate": {
- "value": 0.1,
- "numerator": 0,
- "denominator": 0,
- "label": "string",
- "definition": "string"
}, - "learning_continuation_rate": {
- "value": 0.1,
- "numerator": 0,
- "denominator": 0,
- "label": "string",
- "definition": "string"
}, - "ai_support_rate": {
- "value": 0.1,
- "numerator": 0,
- "denominator": 0,
- "label": "string",
- "definition": "string"
}, - "teacher_review_rate": {
- "value": 0.1,
- "numerator": 0,
- "denominator": 0,
- "label": "string",
- "definition": "string"
}
}, - "period": {
- "start": "2019-08-24",
- "end": "2019-08-24"
}
}ロールに応じたスコープで、最近のイベント (セッション完了・レビュー等) を時系列で返す。
スコープ (自動決定):
system_admin: 全校school_admin: 自校shunin: 自学年tannin: 自クラス| limit | integer [ 1 .. 200 ] Default: 50 取得件数 |
| cursor | string ページネーション用カーソル (前回レスポンスの |
{- "next_cursor": "string",
- "items": [
- {
- "type": "screening_completed",
- "occurred_at": "2019-08-24T14:15:22Z",
- "student": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "family_name": "string",
- "given_name": "string",
- "class_id": 0,
- "student_no": 0
}, - "session_id": 0,
- "test_type": "screening",
- "actor": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "family_name": "string",
- "given_name": "string"
}
}
]
}新しい学校を登録する。同時に以下を行う:
auto_generate_classes 指定時)send_invitation: true の場合)認可: system_admin のみ
| id required | string [ 1 .. 64 ] characters ^[a-zA-Z0-9_-]+$ 学校 ID (人間可読、英数字・ハイフン・アンダースコア) |
| name required | string [ 1 .. 100 ] characters |
object (AutoGenerateClassesOptions) | |
required | object (InitialSchoolAdmin) |
| send_invitation | boolean Default: true 初代管理者へ招待メールを送信するか |
{- "id": "string",
- "name": "string",
- "auto_generate_classes": {
- "school_year": 0,
- "classes_per_grade": 6,
- "naming_pattern": "number"
}, - "initial_admin": {
- "email": "user@example.com",
- "family_name": "string",
- "given_name": "string",
- "family_name_kana": "string",
- "given_name_kana": "string"
}, - "send_invitation": true
}{- "school": {
- "id": "string",
- "name": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}, - "classes": [
- {
- "id": 0,
- "school_id": "string",
- "school_year": 0,
- "grade": 1,
- "name": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "classes_summary": {
- "classes_created": 0,
- "grades_covered": [
- 0
], - "school_year": 0
}, - "initial_admin": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "school_id": "string",
- "class_id": 0,
- "email": "user@example.com",
- "family_name": "string",
- "given_name": "string",
- "family_name_kana": "string",
- "given_name_kana": "string",
- "role": "school_admin",
- "has_signed_up": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}, - "invitation": {
- "queued": true,
- "invitation_id": "string",
- "expires_at": "2019-08-24T14:15:22Z"
}
}登録されている学校の一覧を取得。
認可: system_admin のみ
| limit | integer [ 1 .. 200 ] Default: 50 取得件数 |
| cursor | string ページネーション用カーソル (前回レスポンスの |
{- "next_cursor": "string",
- "items": [
- {
- "id": "string",
- "name": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
]
}認可:
system_admin: 任意の学校school_admin: 自校のみ| schoolId required | string^[a-zA-Z0-9_-]+$ 学校 ID |
{- "id": "string",
- "name": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "summary": {
- "class_count": 0,
- "student_count": 0,
- "teacher_count": 0,
- "current_school_year": 0
}
}認可:
system_admin: 任意の学校school_admin: 自校のみ更新可能なフィールドは name のみ。id (主キー) は変更不可。
| schoolId required | string^[a-zA-Z0-9_-]+$ 学校 ID |
| name | string [ 1 .. 100 ] characters |
{- "name": "string"
}{- "id": "string",
- "name": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}指定したクラスを一括作成する。
system_admin または school_admin (自校のみ)(school_year, grade, name) の組が一意でなければ重複エラー| schoolId required | string^[a-zA-Z0-9_-]+$ 学校 ID |
required | Array of objects (ClassCreate) [ 1 .. 100 ] items |
| on_conflict | string Default: "error" Enum: "error" "skip" |
{- "classes": [
- {
- "school_year": 2020,
- "grade": 1,
- "name": "string"
}
], - "on_conflict": "error"
}{- "summary": {
- "total": 0,
- "succeeded": 0,
- "failed": 0,
- "skipped": 0
}, - "results": [
- {
- "row": 0,
- "status": "created",
- "id": 0,
- "school_year": 0,
- "grade": 0,
- "name": "string",
- "error": {
- "code": "CLASS_ALREADY_EXISTS",
- "message": "string"
}
}
]
}指定された school_year について、1〜6年生の各学年に同数のクラスを自動生成する。
system_admin または school_admin (自校のみ)number (1組, 2組, ...) または letter (A組, B組, ...)on_conflict の指定に従うauto_generate_classes と同じロジック| schoolId required | string^[a-zA-Z0-9_-]+$ 学校 ID |
| school_year required | integer |
| classes_per_grade | integer [ 1 .. 10 ] Default: 6 |
| naming_pattern | string Default: "number" Enum: "number" "letter" |
| on_conflict | string Default: "skip" Enum: "error" "skip" generate のデフォルトは |
{- "school_year": 0,
- "classes_per_grade": 6,
- "naming_pattern": "number",
- "on_conflict": "error"
}{- "summary": {
- "total": 0,
- "succeeded": 0,
- "failed": 0,
- "skipped": 0
}, - "results": [
- {
- "row": 0,
- "status": "created",
- "id": 0,
- "school_year": 0,
- "grade": 0,
- "name": "string",
- "error": {
- "code": "CLASS_ALREADY_EXISTS",
- "message": "string"
}
}
]
}ロールに応じた絞り込み:
system_admin / school_admin: 学校全体shunin: 自学年のみtannin: 自クラスのみ| schoolId required | string^[a-zA-Z0-9_-]+$ 学校 ID |
| school_year | integer 年度で絞り込み (省略時は現在の年度) |
| grade | integer [ 1 .. 6 ] 学年で絞り込み |
| limit | integer [ 1 .. 200 ] Default: 50 取得件数 |
| cursor | string ページネーション用カーソル (前回レスポンスの |
{- "next_cursor": "string",
- "items": [
- {
- "id": 0,
- "school_id": "string",
- "school_year": 0,
- "grade": 1,
- "name": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "summary": {
- "student_count": 0,
- "tannin": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "family_name": "string",
- "given_name": "string"
}
}
}
]
}クラス全体のテスト結果集計を返す。教員ダッシュボードのクラス統計画面で使用。
tannin: 自クラスのみshunin: 自学年のクラスschool_admin: 自校のクラスsystem_admin: 全校period で対象期間を切り替え。history を返すかどうかも include_history で制御| classId required | integer <int64> クラス ID (school_class.id) |
| test_type | string (TestType) Enum: "screening" "posttest" 省略時は screening |
| period | string Default: "last_30_days" Enum: "last_7_days" "last_30_days" "current_school_year" "all" |
| from | string <date> period=custom 用 (period が指定されない場合) |
| to | string <date> |
| include_history | boolean Default: false 過去のテスト回トレンドを含めるか |
{- "class": {
- "id": 0,
- "school_id": "string",
- "school_year": 0,
- "grade": 1,
- "name": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "student_count": 0
}, - "test_type": "screening",
- "period": {
- "start": "2019-08-24",
- "end": "2019-08-24"
}, - "metrics": {
- "submission_count": 0,
- "submission_rate": 0.1,
- "avg_correct_rate": 0.1,
- "ai_detected_count": 0,
- "needs_support_count": 0,
- "teacher_reviewed_count": 0
}, - "teacher_judgment_distribution": {
- "normal": 0,
- "watch": 0,
- "support": 0,
- "unreviewed": 0
}, - "history": [
- {
- "round": 0,
- "date": "2019-08-24",
- "submission_count": 0,
- "avg_correct_rate": 0.1,
- "ai_detected_count": 0,
- "needs_support_count": 0
}
]
}| classId required | integer <int64> クラス ID (school_class.id) |
{- "id": 0,
- "school_id": "string",
- "school_year": 0,
- "grade": 1,
- "name": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z",
- "summary": {
- "student_count": 0,
- "tannin": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "family_name": "string",
- "given_name": "string"
}
}
}system_admin / school_admin (自校)| classId required | integer <int64> クラス ID (school_class.id) |
| name | string [ 1 .. 30 ] characters |
{- "name": "string"
}{- "id": 0,
- "school_id": "string",
- "school_year": 0,
- "grade": 1,
- "name": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}system_admin / school_admin (自校)| classId required | integer <int64> クラス ID (school_class.id) |
{- "error": {
- "code": "INVALID_EMAIL_FORMAT",
- "message": "メールアドレスの形式が不正です",
- "details": null
}
}指定された学校に複数の生徒を一括登録する。
system_admin: 任意の学校school_admin: 自校全体shunin: 自学年内のクラスへの登録のみ (リクエストの class_id が自学年外の場合 403)tannin: 自クラスへの登録のみ (リクエストの class_id が自クラス外の場合 403)on_conflict: error の場合は全件成功 / 全件ロールバックon_conflict: skip の場合は重複行をスキップして残りを処理results に行単位の結果を含む| schoolId required | string^[a-zA-Z0-9_-]+$ 学校 ID |
required | Array of objects (StudentCreate) [ 1 .. 1000 ] items |
| on_conflict | string Default: "error" Enum: "error" "skip" 重複時の挙動:
|
{- "students": [
- {
- "class_id": 0,
- "student_no": 1,
- "gakuseki_no": "string",
- "email": "user@example.com",
- "family_name": "string",
- "given_name": "string",
- "family_name_kana": "string",
- "given_name_kana": "string"
}
], - "on_conflict": "error"
}{- "summary": {
- "total": 0,
- "succeeded": 0,
- "failed": 0,
- "skipped": 0
}, - "results": [
- {
- "row": 0,
- "status": "created",
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "gakuseki_no": "string",
- "email": "user@example.com",
- "error": {
- "code": "EMAIL_ALREADY_EXISTS",
- "message": "string",
- "field": "string",
- "value": null
}
}
]
}指定された学校配下の生徒を一覧取得する。 ロールに応じて自動的に絞り込まれる:
system_admin / school_admin: 学校全体shunin: 自学年のクラスのみtannin: 自クラスのみ| schoolId required | string^[a-zA-Z0-9_-]+$ 学校 ID |
| class_id | integer 特定クラスで絞り込む (任意) |
| grade | integer [ 1 .. 6 ] 学年で絞り込む (任意) |
| has_signed_up | boolean サインアップ済みかで絞り込む:
|
| limit | integer [ 1 .. 200 ] Default: 50 取得件数 |
| cursor | string ページネーション用カーソル (前回レスポンスの |
{- "next_cursor": "string",
- "items": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "school_id": "string",
- "class_id": 0,
- "student_no": 1,
- "gakuseki_no": "string",
- "email": "user@example.com",
- "family_name": "string",
- "given_name": "string",
- "family_name_kana": "string",
- "given_name_kana": "string",
- "has_signed_up": true,
- "created_at": "2019-08-24T14:15:22Z",
- "last_active_at": "2019-08-24T14:15:22Z"
}
]
}認可:
system_admin / school_admin: 自校の任意の生徒shunin: 自学年の生徒tannin: 自クラスの生徒student: 自分のみ| studentId required | string <uuid> 生徒 ID (UUID v7) |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "school_id": "string",
- "class_id": 0,
- "student_no": 1,
- "gakuseki_no": "string",
- "email": "user@example.com",
- "family_name": "string",
- "given_name": "string",
- "family_name_kana": "string",
- "given_name_kana": "string",
- "has_signed_up": true,
- "created_at": "2019-08-24T14:15:22Z",
- "last_active_at": "2019-08-24T14:15:22Z"
}認可:
system_admin / school_admin: 自校の任意の生徒shunin: 自学年の生徒tannin: 自クラスの生徒メールアドレス変更時の注意:
email_suppression にあっても、新 email は別物として扱われる| studentId required | string <uuid> 生徒 ID (UUID v7) |
| class_id | integer |
| student_no | integer [ 1 .. 99 ] |
| gakuseki_no | string or null |
string <email> | |
| family_name | string |
| given_name | string |
| family_name_kana | string |
| given_name_kana | string |
{- "class_id": 0,
- "student_no": 1,
- "gakuseki_no": "string",
- "email": "user@example.com",
- "family_name": "string",
- "given_name": "string",
- "family_name_kana": "string",
- "given_name_kana": "string"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "school_id": "string",
- "class_id": 0,
- "student_no": 1,
- "gakuseki_no": "string",
- "email": "user@example.com",
- "family_name": "string",
- "given_name": "string",
- "family_name_kana": "string",
- "given_name_kana": "string",
- "has_signed_up": true,
- "created_at": "2019-08-24T14:15:22Z",
- "last_active_at": "2019-08-24T14:15:22Z"
}指定された学校に複数の教員を一括登録する。
system_admin または school_admin (自校のみ)tannin / shunin は class_id 必須school_admin は class_id 任意| schoolId required | string^[a-zA-Z0-9_-]+$ 学校 ID |
required | Array of objects (TeacherCreate) [ 1 .. 1000 ] items |
| on_conflict | string Default: "error" Enum: "error" "skip" |
{- "teachers": [
- {
- "class_id": 0,
- "email": "user@example.com",
- "family_name": "string",
- "given_name": "string",
- "family_name_kana": "string",
- "given_name_kana": "string",
- "role": "school_admin"
}
], - "on_conflict": "error"
}{- "summary": {
- "total": 0,
- "succeeded": 0,
- "failed": 0,
- "skipped": 0
}, - "results": [
- {
- "row": 0,
- "status": "created",
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "email": "user@example.com",
- "error": {
- "code": "EMAIL_ALREADY_EXISTS",
- "message": "string",
- "field": "string",
- "value": null
}
}
]
}ロールに応じた絞り込み:
system_admin / school_admin: 学校全体shunin: 自学年に紐づく教員 + 自分自身tannin: 自分自身のみ| schoolId required | string^[a-zA-Z0-9_-]+$ 学校 ID |
| role | string (TeacherRole) Enum: "school_admin" "shunin" "tannin" ロールで絞り込む (任意) |
| limit | integer [ 1 .. 200 ] Default: 50 取得件数 |
| cursor | string ページネーション用カーソル (前回レスポンスの |
{- "next_cursor": "string",
- "items": [
- {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "school_id": "string",
- "class_id": 0,
- "email": "user@example.com",
- "family_name": "string",
- "given_name": "string",
- "family_name_kana": "string",
- "given_name_kana": "string",
- "role": "school_admin",
- "has_signed_up": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
]
}| teacherId required | string <uuid> 教員 ID (UUID v7) |
{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "school_id": "string",
- "class_id": 0,
- "email": "user@example.com",
- "family_name": "string",
- "given_name": "string",
- "family_name_kana": "string",
- "given_name_kana": "string",
- "role": "school_admin",
- "has_signed_up": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}認可:
system_admin: 任意の教員school_admin: 自校の教員| teacherId required | string <uuid> 教員 ID (UUID v7) |
| class_id | integer or null |
string <email> | |
| family_name | string |
| given_name | string |
| family_name_kana | string |
| given_name_kana | string |
| role | string (TeacherRole) Enum: "school_admin" "shunin" "tannin"
|
{- "class_id": 0,
- "email": "user@example.com",
- "family_name": "string",
- "given_name": "string",
- "family_name_kana": "string",
- "given_name_kana": "string",
- "role": "school_admin"
}{- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "school_id": "string",
- "class_id": 0,
- "email": "user@example.com",
- "family_name": "string",
- "given_name": "string",
- "family_name_kana": "string",
- "given_name_kana": "string",
- "role": "school_admin",
- "has_signed_up": true,
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}招待状況の一覧を返す。教員ダッシュボードの「招待状況」画面で使用。
スコープ (自動決定):
system_admin: 全校 (school_id クエリパラで絞り込み可)school_admin: 自校shunin: 自学年の student に対する招待のみtannin: 自クラスの student に対する招待のみ各招待の status:
active: 未消費・未期限切れexpired: 期限切れconsumed: 消費済み (サインアップ完了)can_resend_at は次に再送できる時刻 (3 分のレート制限)。
| school_id | string |
| class_id | integer <int64> |
| user_type | string Enum: "student" "teacher" |
| status | string Enum: "active" "expired" "consumed" 複数指定する場合はカンマ区切り (例: |
| limit | integer [ 1 .. 200 ] Default: 50 取得件数 |
| cursor | string ページネーション用カーソル (前回レスポンスの |
{- "next_cursor": "string",
- "items": [
- {
- "user_type": "student",
- "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5",
- "user": {
- "family_name": "string",
- "given_name": "string",
- "class_id": 0,
- "student_no": 0
}, - "email": "user@example.com",
- "status": "active",
- "expires_at": "2019-08-24T14:15:22Z",
- "sent_at": "2019-08-24T14:15:22Z",
- "consumed_at": "2019-08-24T14:15:22Z",
- "can_resend_at": "2019-08-24T14:15:22Z"
}
], - "summary": {
- "total": 0,
- "active": 0,
- "expired": 0,
- "consumed": 0
}
}指定された複数のユーザー (student / teacher) に招待メールを送信する。
options.expires_in_hours で上書き可能skip_already_signed_up でスキップ可能email_suppression にあるユーザーへの送信は失敗扱い認可:
system_admin: 任意のユーザー (student / teacher)school_admin: 自校の任意のユーザー (student / teacher)shunin: 自学年の student のみ (teacher は招待不可)tannin: 自クラスの student のみ (teacher は招待不可)targets に権限外のユーザーが含まれる場合、その行は failed (reason: permission_denied) として扱う。
required | Array of objects (InvitationTarget) [ 1 .. 100 ] items |
object |
{- "targets": [
- {
- "user_type": "student",
- "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5"
}
], - "options": {
- "skip_already_signed_up": true,
- "expires_in_hours": 72
}
}{- "summary": {
- "total": 0,
- "queued": 0,
- "skipped": 0,
- "failed": 0
}, - "results": [
- {
- "user_type": "student",
- "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5",
- "status": "queued",
- "invitation_id": "string",
- "reason": "already_signed_up"
}
]
}フロントエンドが招待リンクを踏んだ直後に呼ぶエンドポイント。 token が有効かどうかを確認し、サインアップ画面に表示する情報 (氏名、学校名、有効期限) を返す。
このエンドポイントは認証不要。token そのものが認証として機能する。
| token required | string >= 32 characters 招待 token (URL-safe base64) |
{- "valid": true,
- "user_type": "student",
- "email": "user@example.com",
- "family_name": "string",
- "given_name": "string",
- "school_name": "string",
- "expires_at": "2019-08-24T14:15:22Z"
}指定されたユーザーに招待を再送する。
email_suppression にあるアドレスは送信されない認可:
system_admin: 任意のユーザーschool_admin: 自校の任意のユーザー (student / teacher)shunin: 自学年の student のみtannin: 自クラスの student のみteacher の再送は school_admin 以上のみ。
| userId required | string <uuid> |
| user_type required | string Enum: "student" "teacher" |
{- "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5",
- "user_type": "student",
- "status": "queued",
- "invitation_id": "string",
- "expires_at": "2019-08-24T14:15:22Z"
}指定された学校に所属する student/teacher のうち、メール送信が停止されているアドレス一覧を取得する。
認可と取得スコープ:
system_admin: 任意の学校school_admin: 自校全体shunin: 自学年に所属する student の email のみtannin: 自クラスに所属する student の email のみロールに応じてサーバ側で自動的に絞り込まれる。
| schoolId required | string^[a-zA-Z0-9_-]+$ 学校 ID |
| reason | string Enum: "hard_bounce" "complaint" "manual" |
| limit | integer [ 1 .. 200 ] Default: 50 取得件数 |
| cursor | string ページネーション用カーソル (前回レスポンスの |
{- "next_cursor": "string",
- "items": [
- {
- "email": "user@example.com",
- "reason": "hard_bounce",
- "bounce_subtype": "string",
- "diagnostic": "string",
- "suppressed_at": "2019-08-24T14:15:22Z",
- "notes": "string",
- "user": {
- "user_type": "student",
- "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5",
- "family_name": "string",
- "given_name": "string",
- "class_id": 0,
- "student_no": 0,
- "teacher_role": "school_admin"
}
}
]
}指定されたメールアドレスを suppression list から削除する。
AWS SES のアカウントレベル Suppression List からも削除される。
操作は suppression_action_log に記録される。
認可:
system_admin: 任意のアドレスschool_admin: 自校に所属する user の email のみshunin: 自学年に所属する student の email のみtannin: 自クラスに所属する student の email のみ| email required | string <email> |
{- "error": {
- "code": "INVALID_EMAIL_FORMAT",
- "message": "メールアドレスの形式が不正です",
- "details": null
}
}スクリーニングまたは事後テストのセッションを開始する。
student のみ (自分のセッション)| test_type required | string (TestType) Enum: "screening" "posttest" |
| device_model | string デバイスモデル名 (任意) |
{- "test_type": "screening",
- "device_model": "string"
}{- "session_id": 0,
- "category": "screening",
- "started_at": "2019-08-24T14:15:22Z",
- "student_id": "8e4ec631-d04e-4769-bc05-342d3d37b815",
- "enrollment_id": 0,
- "block_id": "string",
- "block_ids": [
- "string"
]
}| sessionId required | integer <int64> セッション ID (letter_session_log.id) |
{- "session_id": 0,
- "category": "screening",
- "student_id": "8e4ec631-d04e-4769-bc05-342d3d37b815",
- "enrollment_id": 0,
- "date": "2019-08-24",
- "started_at": "2019-08-24T14:15:22Z",
- "ended_at": "2019-08-24T14:15:22Z",
- "duration_seconds": 0,
- "is_finished": true,
- "device_model": "string",
- "max_volume_input": 0.1,
- "button_mash_count": 0,
- "errant_tap_count": 0
}| sessionId required | integer <int64> セッション ID (letter_session_log.id) |
| question_char required | string [ 1 .. 8 ] characters 出題された文字 (例 "あ") |
| recognized_text | string or null 認識結果 (音声認識テキスト等) |
| is_correct | boolean or null クライアント判定の正誤。
|
| response_time | number <float> >= 0 応答時間 (秒) |
| is_aborted | boolean Default: false 中断された解答か |
| client_timestamp required | string <date-time> クライアント側のタイムスタンプ (ISO 8601) |
| audio_upload_required | boolean Default: false true の場合、レスポンスに audio_upload (Pre-signed URL) を含める。 クライアントはその URL に対して PUT で音声ファイル (wav) をアップロードする。 |
{- "question_char": "string",
- "recognized_text": "string",
- "is_correct": true,
- "response_time": 0.1,
- "is_aborted": false,
- "client_timestamp": "2019-08-24T14:15:22Z",
- "audio_upload_required": false
}{- "answer_id": 0,
- "recorded_at": "2019-08-24T14:15:22Z",
- "audio_upload": {
- "s3_key": "string",
- "expires_at": "2019-08-24T14:15:22Z"
}
}指定されたセッションの全 answer (解答) を取得。教員レビュー画面で文字グリッドの表示に使用。
student: 自分の解答のみtannin: 自クラスの生徒shunin: 自学年の生徒school_admin: 自校の生徒system_admin: 全校ai_is_correct) と教員判定 (reviewed_is_correct) を含むis_correct は最終的な値 (COALESCE(reviewed_is_correct, ai_is_correct))| sessionId required | integer <int64> セッション ID (letter_session_log.id) |
{- "items": [
- {
- "answer_id": 0,
- "question_char": "string",
- "recognized_text": "string",
- "ai_is_correct": true,
- "reviewed_is_correct": true,
- "is_correct": true,
- "response_time": 0.1,
- "is_aborted": true,
- "timestamp": "2019-08-24T14:15:22Z",
- "has_audio": true,
- "reviewed_by": "92ab4dbc-1b27-40ce-b24b-7dde8f4709be",
- "reviewed_at": "2019-08-24T14:15:22Z"
}
]
}セッションを終了し、テスト結果を計算する。
letter_session_log の終了時刻と duration を更新letter_test_result を作成 (correct_count, total_count, correct_rate, ai_judgment 等)teacher_judgment は教員レビュー前のため NULLletter_character_stat / letter_block_stat / letter_daily_record / student_status は更新しない (assessment は習熟度測定の対象外)pending_count == 0 (= 解答すべての is_correct が確定済み): finish 時点で同期的に AI 判定 (T式準拠 correct_count < 20 ? 'support' : 'normal') を確定するpending_count > 0 かつ test_type が screening または posttest: ai_judgment: null で先行作成し、SQS の判定キューにエンキュー。Worker が ML API で逐次判定 → letter_answer_log.is_correct を埋める → 完了したら correct_count / correct_rate / ai_judgment を再計算する。教員はリロードで結果反映を見るpending_count > 0 のまま、完了で 0 になる。教員手動レビューで reviewed_is_correct が入ると is_correct の値に関係なく集計に反映 (COALESCE(reviewed_is_correct, is_correct))| sessionId required | integer <int64> セッション ID (letter_session_log.id) |
| ended_at required | string <date-time> クライアント側の終了時刻 |
| max_volume_input | number <float> [ 0 .. 1 ] |
| button_mash_count | integer >= 0 |
| errant_tap_count | integer >= 0 |
{- "ended_at": "2019-08-24T14:15:22Z",
- "max_volume_input": 1,
- "button_mash_count": 0,
- "errant_tap_count": 0
}{- "session_id": 0,
- "category": "screening",
- "started_at": "2019-08-24T14:15:22Z",
- "ended_at": "2019-08-24T14:15:22Z",
- "duration_seconds": 0,
- "summary": {
- "total_count": 0,
- "correct_count": 0,
- "incorrect_count": 0,
- "pending_count": 0,
- "correct_rate": 1,
- "average_response_time": 0.1,
- "max_response_time": 0.1,
- "min_response_time": 0.1
}, - "result": {
- "test_type": "screening",
- "correct_count": 0,
- "total_count": 0,
- "pending_count": 0,
- "correct_rate": 0.1,
- "ai_judgment": "normal",
- "teacher_judgment": "normal"
}
}指定されたアセスメントセッション内の全 answer の音声ファイルの再生用 Pre-signed URL を返す。
student: 自分の結果tannin: 自クラスshunin: 自学年school_admin: 自校| sessionId required | integer <int64> セッション ID (letter_session_log.id) |
{- "items": [
- {
- "answer_id": 0,
- "question_char": "string",
- "expires_at": "2019-08-24T14:15:22Z"
}
]
}個別の answer の再生用 Pre-signed URL を返す。
| sessionId required | integer <int64> セッション ID (letter_session_log.id) |
| answerId required | integer <int64> 解答 ID (letter_answer_log.id) |
{- "expires_at": "2019-08-24T14:15:22Z",
- "s3_key": "string"
}指定された answer に対して、教員が手動で正誤を上書きする (AI/自動判定をオーバーライド)。
is_correct は変更されず、reviewed_is_correct がセットされるreviewed_is_correct: null を渡すと、教員レビューを取り消し (AI 判定に戻す)reviewed_by = actor.userId、reviewed_at = NOW() を自動セットtannin: 自クラスshunin: 自学年school_admin: 自校system_admin: 全校student は不可| sessionId required | integer <int64> セッション ID (letter_session_log.id) |
| answerId required | integer <int64> 解答 ID (letter_answer_log.id) |
| is_correct required | boolean or null 教員判定の正誤。
|
{- "is_correct": true
}{- "answer_id": 0,
- "question_char": "string",
- "ai_is_correct": true,
- "reviewed_is_correct": true,
- "is_correct": true,
- "reviewed_by": "92ab4dbc-1b27-40ce-b24b-7dde8f4709be",
- "reviewed_at": "2019-08-24T14:15:22Z",
- "response_time": 0.1
}モックアップの「判定を確定する」ボタンに対応。複数文字の正誤を一度に確定する。
| sessionId required | integer <int64> セッション ID (letter_session_log.id) |
required | Array of objects (BulkAnswerReviewItem) [ 1 .. 200 ] items |
{- "reviews": [
- {
- "answer_id": 0,
- "is_correct": true
}
]
}{- "summary": {
- "total": 0,
- "succeeded": 0,
- "failed": 0
}, - "items": [
- {
- "answer_id": 0,
- "question_char": "string",
- "ai_is_correct": true,
- "reviewed_is_correct": true,
- "is_correct": true,
- "reviewed_by": "92ab4dbc-1b27-40ce-b24b-7dde8f4709be",
- "reviewed_at": "2019-08-24T14:15:22Z",
- "response_time": 0.1
}
]
}category=screening または posttest のセッションに紐づく test_result を取得。
student: 自分の結果tannin: 自クラスshunin: 自学年school_admin: 自校| sessionId required | integer <int64> セッション ID (letter_session_log.id) |
{- "session_id": 0,
- "student_id": "8e4ec631-d04e-4769-bc05-342d3d37b815",
- "enrollment_id": 0,
- "test_type": "screening",
- "correct_count": 0,
- "total_count": 0,
- "pending_count": 0,
- "correct_rate": 0.1,
- "ai_judgment": "normal",
- "teacher_judgment": "normal",
- "teacher_judgment_by": "9828032b-0743-40c5-8a73-1e0a1b844fb0",
- "teacher_judgment_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}教員によるレビュー結果 (teacher_judgment) を更新。
tannin (自クラス) / shunin (自学年) / school_admin (自校) / system_adminstudent は不可teacher_judgment_by = actor.userId および teacher_judgment_at = NOW() を自動セットteacher_judgment を null にすると、レビューを取り消し ("未レビュー" に戻す)| sessionId required | integer <int64> セッション ID (letter_session_log.id) |
| teacher_judgment | string or null Enum: "normal" "watch" "support" 教員判定 (normal/watch/support)。null でレビュー取り消し |
{- "teacher_judgment": "normal"
}{- "session_id": 0,
- "student_id": "8e4ec631-d04e-4769-bc05-342d3d37b815",
- "enrollment_id": 0,
- "test_type": "screening",
- "correct_count": 0,
- "total_count": 0,
- "pending_count": 0,
- "correct_rate": 0.1,
- "ai_judgment": "normal",
- "teacher_judgment": "normal",
- "teacher_judgment_by": "9828032b-0743-40c5-8a73-1e0a1b844fb0",
- "teacher_judgment_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}学習モード (category=learning) のセッションを開始する。
student のみ (自分)| block_id | string 学習対象のブロック ID (単数指定の後方互換)。
|
| block_ids | Array of strings <= 20 items 学習対象のブロック ID 群 (混合練習で複数指定可)。 セッションに保存され、終了時に各ブロックの習熟度を独立に更新する。 空配列または省略時は「混合練習」扱いでブロック単位集計を行わない。 |
| device_model | string |
{- "block_id": "string",
- "block_ids": [
- "string"
], - "device_model": "string"
}{- "session_id": 0,
- "category": "screening",
- "started_at": "2019-08-24T14:15:22Z",
- "student_id": "8e4ec631-d04e-4769-bc05-342d3d37b815",
- "enrollment_id": 0,
- "block_id": "string",
- "block_ids": [
- "string"
]
}| sessionId required | integer <int64> セッション ID (letter_session_log.id) |
{- "session_id": 0,
- "category": "screening",
- "student_id": "8e4ec631-d04e-4769-bc05-342d3d37b815",
- "enrollment_id": 0,
- "date": "2019-08-24",
- "started_at": "2019-08-24T14:15:22Z",
- "ended_at": "2019-08-24T14:15:22Z",
- "duration_seconds": 0,
- "is_finished": true,
- "device_model": "string",
- "max_volume_input": 0.1,
- "button_mash_count": 0,
- "errant_tap_count": 0
}| sessionId required | integer <int64> セッション ID (letter_session_log.id) |
| question_char required | string [ 1 .. 8 ] characters 出題された文字 (例 "あ") |
| recognized_text | string or null 認識結果 (音声認識テキスト等) |
| is_correct | boolean or null クライアント判定の正誤。
|
| response_time | number <float> >= 0 応答時間 (秒) |
| is_aborted | boolean Default: false 中断された解答か |
| client_timestamp required | string <date-time> クライアント側のタイムスタンプ (ISO 8601) |
| audio_upload_required | boolean Default: false true の場合、レスポンスに audio_upload (Pre-signed URL) を含める。 クライアントはその URL に対して PUT で音声ファイル (wav) をアップロードする。 |
{- "question_char": "string",
- "recognized_text": "string",
- "is_correct": true,
- "response_time": 0.1,
- "is_aborted": false,
- "client_timestamp": "2019-08-24T14:15:22Z",
- "audio_upload_required": false
}{- "answer_id": 0,
- "recorded_at": "2019-08-24T14:15:22Z",
- "audio_upload": {
- "s3_key": "string",
- "expires_at": "2019-08-24T14:15:22Z"
}
}セッションを終了し、習熟度関連テーブルを更新する。
| sessionId required | integer <int64> セッション ID (letter_session_log.id) |
| ended_at required | string <date-time> クライアント側の終了時刻 |
| max_volume_input | number <float> [ 0 .. 1 ] |
| button_mash_count | integer >= 0 |
| errant_tap_count | integer >= 0 |
{- "ended_at": "2019-08-24T14:15:22Z",
- "max_volume_input": 1,
- "button_mash_count": 0,
- "errant_tap_count": 0
}{- "session_id": 0,
- "category": "learning",
- "started_at": "2019-08-24T14:15:22Z",
- "ended_at": "2019-08-24T14:15:22Z",
- "duration_seconds": 0,
- "summary": {
- "total_count": 0,
- "correct_count": 0,
- "incorrect_count": 0,
- "pending_count": 0,
- "correct_rate": 1,
- "average_response_time": 0.1,
- "max_response_time": 0.1,
- "min_response_time": 0.1
}, - "block_progress": {
- "block_id": "string",
- "previous_clear_count": 0,
- "new_clear_count": 0,
- "previous_mastery_rate": 0.1,
- "new_mastery_rate": 0.1,
- "is_block_cleared": true
}, - "block_progresses": [
- {
- "block_id": "string",
- "previous_clear_count": 0,
- "new_clear_count": 0,
- "previous_mastery_rate": 0.1,
- "new_mastery_rate": 0.1,
- "is_block_cleared": true
}
], - "character_breakdown": [
- {
- "char_id": "string",
- "correct": true,
- "response_time": 0.1,
- "previous_status": 0,
- "new_status": 0,
- "previous_correct_count": 0,
- "new_correct_count": 0
}
]
}student: 自分の結果tannin: 自クラスshunin: 自学年school_admin: 自校| sessionId required | integer <int64> セッション ID (letter_session_log.id) |
{- "items": [
- {
- "answer_id": 0,
- "question_char": "string",
- "expires_at": "2019-08-24T14:15:22Z"
}
]
}| sessionId required | integer <int64> セッション ID (letter_session_log.id) |
| answerId required | integer <int64> 解答 ID (letter_answer_log.id) |
{- "expires_at": "2019-08-24T14:15:22Z",
- "s3_key": "string"
}| sessionId required | integer <int64> セッション ID (letter_session_log.id) |
| answerId required | integer <int64> 解答 ID (letter_answer_log.id) |
| is_correct required | boolean or null 教員判定の正誤。
|
{- "is_correct": true
}{- "answer_id": 0,
- "question_char": "string",
- "ai_is_correct": true,
- "reviewed_is_correct": true,
- "is_correct": true,
- "reviewed_by": "92ab4dbc-1b27-40ce-b24b-7dde8f4709be",
- "reviewed_at": "2019-08-24T14:15:22Z",
- "response_time": 0.1
}| sessionId required | integer <int64> セッション ID (letter_session_log.id) |
required | Array of objects (BulkAnswerReviewItem) [ 1 .. 200 ] items |
{- "reviews": [
- {
- "answer_id": 0,
- "is_correct": true
}
]
}{- "summary": {
- "total": 0,
- "succeeded": 0,
- "failed": 0
}, - "items": [
- {
- "answer_id": 0,
- "question_char": "string",
- "ai_is_correct": true,
- "reviewed_is_correct": true,
- "is_correct": true,
- "reviewed_by": "92ab4dbc-1b27-40ce-b24b-7dde8f4709be",
- "reviewed_at": "2019-08-24T14:15:22Z",
- "response_time": 0.1
}
]
}学校・クラス・生徒の枠を横断してテスト結果を取得する API。 教員ダッシュボードの「結果一覧」「レビューワークフロー」で使用。
スコープ (自動決定):
system_admin: 全校 (任意のクエリパラで絞り込み)school_admin: 自校shunin: 自学年tannin: 自クラスstudent: 自分フィルタの組み合わせで「未レビューのみ」「support 判定のみ」など柔軟な絞り込みが可能。
| school_id | string system_admin / school_admin の絞り込み用 |
| class_id | integer <int64> |
| student_id | string <uuid> |
| test_type | string (TestType) Enum: "screening" "posttest" |
| ai_judgment | string Enum: "normal" "support" "null" AI 判定で絞り込み:
|
| teacher_judgment | string Enum: "normal" "watch" "support" "null" 教員判定で絞り込み:
|
| review_required | boolean true の場合、AI 判定 = 'support' かつ 教員判定 = NULL のものだけ返す。
教員レビュー画面の「要レビューだけ見る」絞り込みに対応する。
|
| from | string <date> 受験日の下限 (含む) |
| to | string <date> 受験日の上限 (含む) |
| limit | integer [ 1 .. 200 ] Default: 50 取得件数 |
| cursor | string ページネーション用カーソル (前回レスポンスの |
{- "next_cursor": "string",
- "items": [
- {
- "session_id": 0,
- "student": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "family_name": "string",
- "given_name": "string",
- "class_id": 0,
- "student_no": 0
}, - "test_type": "screening",
- "test_date": "2019-08-24",
- "ai_judgment": "normal",
- "teacher_judgment": "normal",
- "teacher_judgment_at": "2019-08-24T14:15:22Z",
- "correct_count": 0,
- "total_count": 0,
- "correct_rate": 0.1
}
], - "summary": {
- "total": 0,
- "ai_support_count": 0,
- "teacher_reviewed_count": 0,
- "teacher_support_count": 0,
- "teacher_watch_count": 0,
- "teacher_unreviewed_count": 0,
- "teacher_review_required_count": 0,
- "latest_normal_count": 0,
- "latest_watch_count": 0,
- "latest_support_count": 0
}
}| studentId required | string <uuid> 生徒 ID (UUID v7) |
| category | string Enum: "screening" "learning" "posttest" |
| from | string <date> 開始日 (含む) |
| to | string <date> 終了日 (含む) |
| limit | integer [ 1 .. 200 ] Default: 50 取得件数 |
| cursor | string ページネーション用カーソル (前回レスポンスの |
{- "next_cursor": "string",
- "items": [
- {
- "session_id": 0,
- "category": "screening",
- "date": "2019-08-24",
- "started_at": "2019-08-24T14:15:22Z",
- "ended_at": "2019-08-24T14:15:22Z",
- "duration_seconds": 0,
- "is_finished": true,
- "answer_count": 0,
- "correct_count": 0,
- "correct_rate": 0.1,
- "ai_judgment": "normal",
- "teacher_judgment": "normal"
}
]
}| studentId required | string <uuid> 生徒 ID (UUID v7) |
| status | integer >= 0 status で絞り込み |
| limit | integer [ 1 .. 200 ] Default: 50 取得件数 |
| cursor | string ページネーション用カーソル (前回レスポンスの |
{- "next_cursor": "string",
- "items": [
- {
- "char_id": "string",
- "correct_count": 0,
- "incorrect_count": 0,
- "accumulated_fast_correct_count": 0,
- "mastery_count": 0,
- "status": 0,
- "average_response_time": 0.1,
- "last_3_response_times": [
- 0.1
], - "last_5_results": [
- true
], - "updated_at": "2019-08-24T14:15:22Z"
}
]
}| studentId required | string <uuid> 生徒 ID (UUID v7) |
| limit | integer [ 1 .. 200 ] Default: 50 取得件数 |
| cursor | string ページネーション用カーソル (前回レスポンスの |
{- "next_cursor": "string",
- "items": [
- {
- "block_id": "string",
- "clear_count": 0,
- "mastery_rate": 1,
- "updated_at": "2019-08-24T14:15:22Z"
}
]
}生徒の learning セッションの日次集計を返す。 screening / posttest はここには含まれない (test_result API で取得)。
| studentId required | string <uuid> 生徒 ID (UUID v7) |
| from | string <date> |
| to | string <date> |
| limit | integer [ 1 .. 200 ] Default: 50 取得件数 |
{- "items": [
- {
- "date": "2019-08-24",
- "answer_count": 0,
- "total_play_duration": 0.1
}
]
}| studentId required | string <uuid> 生徒 ID (UUID v7) |
{- "student_id": "8e4ec631-d04e-4769-bc05-342d3d37b815",
- "last_login_date": "2019-08-24",
- "login_streak": 0,
- "completed_dyslexia_learning_tutorial": true,
- "completed_dyslexia_screening_tutorial": true,
- "updated_at": "2019-08-24T14:15:22Z"
}チュートリアル完了フラグを更新する。
last_login_date / login_streak は POST /me/login で更新されるためこの API では変更できない。
system_admin| studentId required | string <uuid> 生徒 ID (UUID v7) |
| completed_dyslexia_learning_tutorial | boolean |
| completed_dyslexia_screening_tutorial | boolean |
{- "completed_dyslexia_learning_tutorial": true,
- "completed_dyslexia_screening_tutorial": true
}{- "student_id": "8e4ec631-d04e-4769-bc05-342d3d37b815",
- "last_login_date": "2019-08-24",
- "login_streak": 0,
- "completed_dyslexia_learning_tutorial": true,
- "completed_dyslexia_screening_tutorial": true,
- "updated_at": "2019-08-24T14:15:22Z"
}サービス全体の利用状況メトリクスを返す。
system_admin のみ{- "schools": {
- "total": 0,
- "active_last_7_days": 0
}, - "users": {
- "students_total": 0,
- "teachers_total": 0,
- "students_active_last_7_days": 0
}, - "sessions": {
- "total_last_7_days": 0,
- "screening_last_7_days": 0,
- "learning_last_7_days": 0,
- "posttest_last_7_days": 0
}, - "alerts": {
- "ai_support_total_last_30_days": 0,
- "teacher_support_unreviewed": 0
}, - "email": {
- "sent_last_24h": 0,
- "delivered_rate": 0.1,
- "bounce_rate": 0.1,
- "complaint_rate": 0.1,
- "suppression_count": 0
}
}全学校横断で email_suppression を取得する。
system_admin のみ| school_id | string 学校で絞り込み |
| reason | string Enum: "hard_bounce" "complaint" "manual" |
| user_type | string Enum: "student" "teacher" |
| limit | integer [ 1 .. 200 ] Default: 50 取得件数 |
| cursor | string ページネーション用カーソル (前回レスポンスの |
{- "next_cursor": "string",
- "items": [
- {
- "email": "user@example.com",
- "school_id": "string",
- "school_name": "string",
- "user_type": "student",
- "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5",
- "user": {
- "family_name": "string",
- "given_name": "string"
}, - "reason": "hard_bounce",
- "bounce_subtype": "string",
- "suppressed_at": "2019-08-24T14:15:22Z"
}
]
}システムへの操作監査ログを返す。
system_admin のみsuppression_action_log のみを対象 (学校作成や生徒登録などは将来対象に追加)audit_log テーブルに統合する想定| action_type | string Enum: "suppression_added" "suppression_removed" 操作種別で絞り込み |
| performed_by | string <uuid> 操作者で絞り込み |
| from | string <date-time> |
| to | string <date-time> |
| limit | integer [ 1 .. 200 ] Default: 50 取得件数 |
| cursor | string ページネーション用カーソル (前回レスポンスの |
{- "next_cursor": "string",
- "items": [
- {
- "id": 0,
- "action_type": "suppression_added",
- "target_email": "user@example.com",
- "performed_by": {
- "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
- "family_name": "string",
- "given_name": "string"
}, - "performed_at": "2019-08-24T14:15:22Z",
- "notes": "string"
}
]
}