POST - Lesson Plan Metadata
This API allows authenticated users to create and process lesson plan metadata.
Duration Constraint:
- Minimum duration: 30 minutes
- Maximum duration: 90 minutes
How to Use:
- Call
POST /lesson-plan/metadatawith board, grade, subject, section, duration, topic, and optional file uploads. If no file is provided, the system will search for relevant files from the RAG (Retrieval-Augmented Generation) system. - The API validates IDs, uploads files if present or retrieves them from RAG, stores the lesson plan, and triggers background processing.
- On success, you receive a request ID and a message confirming processing has started.
Example Scenario: A teacher wants to create a new lesson plan:
- They submit board, grade, subject, section, duration, topic, and files using this API.
- If no files are uploaded, the system will automatically search for them using RAG.
- The system validates the data, uploads or retrieves files, and starts processing the lesson plan metadata.
- The teacher receives a request ID to track processing status.
POST
/
lesson-plan
/
v1
/
metadata
Create and process lesson plan metadata
curl --request POST \
--url https://api-staging.crazygoldfish.com/lesson-plan/v1/metadata \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form board=3c90c3cc-0d44-4b50-8888-8dd25736052a \
--form grade=3c90c3cc-0d44-4b50-8888-8dd25736052a \
--form subject=3c90c3cc-0d44-4b50-8888-8dd25736052a \
--form duration_minutes=123 \
--form 'topic=<string>' \
--form 'section=<string>' \
--form 'documents=<string>' \
--form audio='@example-file' \
--form 'meta_data={"teacher_id": 199}' \
--form documents.items='@example-file'import requests
url = "https://api-staging.crazygoldfish.com/lesson-plan/v1/metadata"
files = {
"audio": ("example-file", open("example-file", "rb")),
"documents.items": ("example-file", open("example-file", "rb"))
}
payload = {
"board": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"grade": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"subject": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"duration_minutes": "123",
"topic": "<string>",
"section": "<string>",
"documents": "<string>",
"meta_data": "{\"teacher_id\": 199}"
}
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('board', '3c90c3cc-0d44-4b50-8888-8dd25736052a');
form.append('grade', '3c90c3cc-0d44-4b50-8888-8dd25736052a');
form.append('subject', '3c90c3cc-0d44-4b50-8888-8dd25736052a');
form.append('duration_minutes', '123');
form.append('topic', '<string>');
form.append('section', '<string>');
form.append('documents', '<string>');
form.append('audio', '<string>');
form.append('meta_data', '{"teacher_id": 199}');
form.append('documents.items', '{
"fileName": "example-file"
}');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://api-staging.crazygoldfish.com/lesson-plan/v1/metadata', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api-staging.crazygoldfish.com/lesson-plan/v1/metadata",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"board\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"grade\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"subject\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"duration_minutes\"\r\n\r\n123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"topic\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"section\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documents\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"audio\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"meta_data\"\r\n\r\n{\"teacher_id\": 199}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documents.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: multipart/form-data"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api-staging.crazygoldfish.com/lesson-plan/v1/metadata"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"board\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"grade\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"subject\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"duration_minutes\"\r\n\r\n123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"topic\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"section\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documents\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"audio\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"meta_data\"\r\n\r\n{\"teacher_id\": 199}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documents.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api-staging.crazygoldfish.com/lesson-plan/v1/metadata")
.header("Authorization", "Bearer <token>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"board\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"grade\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"subject\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"duration_minutes\"\r\n\r\n123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"topic\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"section\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documents\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"audio\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"meta_data\"\r\n\r\n{\"teacher_id\": 199}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documents.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-staging.crazygoldfish.com/lesson-plan/v1/metadata")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"board\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"grade\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"subject\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"duration_minutes\"\r\n\r\n123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"topic\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"section\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documents\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"audio\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"meta_data\"\r\n\r\n{\"teacher_id\": 199}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documents.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"detail": [
{
"id": "e2b7c8a2-7c2e-4e8a-9b1e-2c3d4e5f6a7b",
"message": "Lesson plan metadata processing started successfully."
}
]
}{
"detail": [
{
"msg": "Board with ID baf36573-d049-4636-9c4b-bc9cda6270fe does not exist."
}
]
}{
"detail": [
{
"msg": "Unexpected error occurred."
}
]
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
multipart/form-data
Board ID (UUID)
Grade ID (UUID)
Subject ID (UUID)
Duration in minutes
Topic
Section (optional)
Optional file uploads
Optional audio URL should be mp3 format
JSON string representing the metadata of the worksheet
Example:
"{\"teacher_id\": 199}"
Response
Lesson plan metadata processing started successfully.
Show child attributes
Show child attributes
Was this page helpful?
⌘I
Create and process lesson plan metadata
curl --request POST \
--url https://api-staging.crazygoldfish.com/lesson-plan/v1/metadata \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: multipart/form-data' \
--form board=3c90c3cc-0d44-4b50-8888-8dd25736052a \
--form grade=3c90c3cc-0d44-4b50-8888-8dd25736052a \
--form subject=3c90c3cc-0d44-4b50-8888-8dd25736052a \
--form duration_minutes=123 \
--form 'topic=<string>' \
--form 'section=<string>' \
--form 'documents=<string>' \
--form audio='@example-file' \
--form 'meta_data={"teacher_id": 199}' \
--form documents.items='@example-file'import requests
url = "https://api-staging.crazygoldfish.com/lesson-plan/v1/metadata"
files = {
"audio": ("example-file", open("example-file", "rb")),
"documents.items": ("example-file", open("example-file", "rb"))
}
payload = {
"board": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"grade": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"subject": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"duration_minutes": "123",
"topic": "<string>",
"section": "<string>",
"documents": "<string>",
"meta_data": "{\"teacher_id\": 199}"
}
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('board', '3c90c3cc-0d44-4b50-8888-8dd25736052a');
form.append('grade', '3c90c3cc-0d44-4b50-8888-8dd25736052a');
form.append('subject', '3c90c3cc-0d44-4b50-8888-8dd25736052a');
form.append('duration_minutes', '123');
form.append('topic', '<string>');
form.append('section', '<string>');
form.append('documents', '<string>');
form.append('audio', '<string>');
form.append('meta_data', '{"teacher_id": 199}');
form.append('documents.items', '{
"fileName": "example-file"
}');
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
options.body = form;
fetch('https://api-staging.crazygoldfish.com/lesson-plan/v1/metadata', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api-staging.crazygoldfish.com/lesson-plan/v1/metadata",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"board\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"grade\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"subject\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"duration_minutes\"\r\n\r\n123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"topic\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"section\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documents\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"audio\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"meta_data\"\r\n\r\n{\"teacher_id\": 199}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documents.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: multipart/form-data"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api-staging.crazygoldfish.com/lesson-plan/v1/metadata"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"board\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"grade\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"subject\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"duration_minutes\"\r\n\r\n123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"topic\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"section\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documents\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"audio\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"meta_data\"\r\n\r\n{\"teacher_id\": 199}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documents.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api-staging.crazygoldfish.com/lesson-plan/v1/metadata")
.header("Authorization", "Bearer <token>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"board\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"grade\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"subject\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"duration_minutes\"\r\n\r\n123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"topic\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"section\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documents\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"audio\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"meta_data\"\r\n\r\n{\"teacher_id\": 199}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documents.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-staging.crazygoldfish.com/lesson-plan/v1/metadata")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"board\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"grade\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"subject\"\r\n\r\n3c90c3cc-0d44-4b50-8888-8dd25736052a\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"duration_minutes\"\r\n\r\n123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"topic\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"section\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documents\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"audio\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"meta_data\"\r\n\r\n{\"teacher_id\": 199}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"documents.items\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n{\r\n \"fileName\": \"example-file\"\r\n}\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"detail": [
{
"id": "e2b7c8a2-7c2e-4e8a-9b1e-2c3d4e5f6a7b",
"message": "Lesson plan metadata processing started successfully."
}
]
}{
"detail": [
{
"msg": "Board with ID baf36573-d049-4636-9c4b-bc9cda6270fe does not exist."
}
]
}{
"detail": [
{
"msg": "Unexpected error occurred."
}
]
}