Lingara Lingara Belge Rêbername API Pirtûkxane Sepan Avakirin Sepana webê
Ziman: Kurdî

Planeke dersê çêbike

Guhertoya API 2026-10-affable-towhee

post https://api.getlingara.com/v1/lesson-plans

Dest bi çêkirina planeke dersê dike û pêşketina wê stream dike. started planê hema ku çêbû nav dike, ji ber vê yekê girêdaneke qutbûyî dikare bi GET /v1/lesson-plans/{id}/stream ji nû ve girê bide. Stream bi result an error diqede. Planeke ku ji pirtûkxaneyê tê wek resultekî tenê digihîje.

Scope lesson_plans:write

Parametre

Lingara-Versionheaderstringvebijarkî
Guhertoya API ya ku ev daxwaz pê tê bersivandin. Bêyî wê, tokena gihîştinê guhertoya ku klientê wê pê ve girêdayî ye distîne, û daxwazeke bê token guhertoya niha distîne. Guhertoya ku hîn di pêşxistinê de ye tenê bi binavkirina wê li vir tê gihîştin. Guhertoyeke nenas bi 400 û koda api_version_unknown tê bersivandin. GET /v1/versions guhertoyan rêz dike.

Naveroka daxwazê application/json

contextstringpêwîst
source_langstringpêwîst
target_langstringpêwîst
levelintegerpêwîst

Bersiv

200 Pêşketina planê, paşê plan

Bûyerên streamê text/event-stream

Her 15 çirkeyan şîroveyeke keepalive dişîne.

started PlanStarted
plan_idstringpêwîst
phase PlanPhase
phasestringpêwîst
attemptintegerpêwîst
result PlanResult Weşanê diqedîne
planLessonPlanpêwîst
idstringpêwîst
statusPlanStatuspêwîst
titlestring | nullvebijarkî
source_langstringpêwîst
target_langstringpêwîst
levelintegerpêwîst
created_atstringpêwîst
completed_atstring | nullvebijarkî
ai_generatedbooleanpêwîst
contentLessonPlanContent | nullvebijarkî
introductionstring | nullvebijarkî
learning_objectivesarray of stringpêwîst
vocabularyarray of PlanWordpêwîst
wordstringpêwîst
pronunciationstring | nullvebijarkî
translationstringpêwîst
setsarray of PlanSetpêwîst
numberintegerpêwîst
contextstring | nullvebijarkî
questionsarray of PlanQuestionpêwîst
typestringpêwîst
promptstringpêwîst
optionsarray of string | nullvebijarkî
answerstringpêwîst
explanationstringpêwîst
hintstring | nullvebijarkî
error StreamError Weşanê diqedîne

Di nav bersiva 200 de tê. Rêza rewşê berê hatiye şandin, ji ber vê yekê têkçûnek piştî vebûna weşanê wekî vê bûyerê tê ragihandin.

codestringpêwîst
messagestringpêwîst
plan_idstring | nullvebijarkî

Çewtî

402application/json
Bangeke klienteke pîvandî hat redkirin berî ku tiştek xerc bike. spend_cap_reached: klient an hesabê wê gihîştiye sînorê xercê yê mehane; sînor li rûpela Entegrasyon bilind bike. metered_billing_inactive: fatûrekirina li gorî bikaranînê ji bo vî hesabî ne çalak e; wê li rûpela Entegrasyon saz bike an rêbaza dayînê nû bike.
410application/json
Guhertoya API ya ku ev daxwaz pê tê bersivandin hate rawestandin. Guhertoyeke piştgirîkirî di Lingara-Version de bişîne, an klientê bi guhertoyeke din ve girê bide.
4XXapplication/json
Daxwaz hate redkirin. code sedemê dibêje, û error wê bi gotinan dibêje.
503application/json · text/plain
Xizmet bi demkî ne berdest e; piştî hejmara çirkeyên di Retry-After de dîsa biceribîne. Di dema lênêrînê de naverok nivîsa sade ye, ne zerfa çewtiyê.
5XXapplication/json
Daxwaz hate redkirin. code sedemê dibêje, û error wê bi gotinan dibêje.
codestringpêwîst

Çima daxwaz hat redkirin, wek kodeke domdar ku mirov li gorî wê şax dike: bo nimûne insufficient_scope (403), rate_limited (429) û, ji bo klienteke pîvandî, spend_cap_reached (402) û metered_billing_inactive (402).

errorstringpêwîst

Mînak

Zimanê mînaka kodê

curl

curl -N -X POST "https://api.getlingara.com/v1/lesson-plans" \
  -H "Authorization: Bearer $LINGARA_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"context":"Ordering food at a night market","source_lang":"en","target_lang":"zh","level":2}'

TypeScript

const stream = client.createLessonPlan({
  context: "ordering at a night market",
  source_lang: "en",
  target_lang: "zh",
  level: 2,
});
for await (const ev of stream) {
  if (ev.event === "started") console.log("plan", ev.data.plan_id);
  if (ev.event === "phase") console.log("working:", ev.data.phase);
  if (ev.event === "result") console.log(ev.data.plan.title);
}

Rust

use lingara::models::{CreateLessonPlanEvent, LessonPlanCreateRequest};

let request = LessonPlanCreateRequest {
    context: "ordering at a night market".into(),
    source_lang: "en".into(),
    target_lang: "zh".into(),
    level: 2,
};
let mut stream = client.create_lesson_plan(&request).await?;
while let Some(event) = stream.next().await {
    match event? {
        CreateLessonPlanEvent::Started(started) => println!("plan {}", started.plan_id),
        CreateLessonPlanEvent::Phase(phase) => println!("working: {}", phase.phase),
        CreateLessonPlanEvent::Result(result) => println!("{}", result.plan.title.unwrap_or_default()),
        _ => {}
    }
}

Go

s, err := client.CreateLessonPlan(ctx, lingara.LessonPlanCreateRequest{
	Context:    "ordering at a night market",
	SourceLang: "en",
	TargetLang: "zh",
	Level:      2,
})
if err != nil {
	return err
}
defer s.Close()
for ev, err := range s.Events() {
	if err != nil {
		return err
	}
	switch e := ev.(type) {
	case lingara.CreateLessonPlanEventStarted:
		fmt.Println("plan", e.Data.PlanID)
	case lingara.CreateLessonPlanEventPhase:
		fmt.Println("working:", e.Data.Phase)
	case lingara.CreateLessonPlanEventResult:
		if e.Data.Plan.Title != nil {
			fmt.Println(*e.Data.Plan.Title)
		}
	}
}

Java

import com.getlingara.client.model.CreateLessonPlanEvent;
import com.getlingara.client.model.LessonPlanCreateRequest;

LessonPlanCreateRequest request =
    new LessonPlanCreateRequest()
        .context("Ordering at a night market")
        .level(2)
        .sourceLang("en")
        .targetLang("zh");
try (EventStream<CreateLessonPlanEvent> stream = client.createLessonPlan(request)) {
  for (CreateLessonPlanEvent event : stream) {
    if (event instanceof CreateLessonPlanEvent.Started started) {
      // Keep the id: streamLessonPlan rejoins a generation that was cut off.
      System.out.println("plan " + started.data().getPlanId());
    } else if (event instanceof CreateLessonPlanEvent.Phase phase) {
      System.out.println("phase " + phase.data().getPhase());
    } else if (event instanceof CreateLessonPlanEvent.Result result) {
      System.out.println(result.data().getPlan().getTitle());
    }
  }
}

Kotlin

import com.getlingara.kotlin.LingaraClient
import com.getlingara.kotlin.model.CreateLessonPlanEvent
import com.getlingara.kotlin.model.LessonPlanCreateRequest

val request =
    LessonPlanCreateRequest(context = "Ordering at a night market", sourceLang = "en", targetLang = "zh", level = 2)
client.createLessonPlan(request).use { stream ->
    stream.collect { event ->
        when (event) {
            // Keep the id: streamLessonPlan rejoins a generation that was cut off.
            is CreateLessonPlanEvent.Started -> println("plan ${event.data.planId}")
            is CreateLessonPlanEvent.Phase -> println("phase ${event.data.phase}")
            is CreateLessonPlanEvent.Result -> println(event.data.plan.title)
        }
    }
}

Ruby

client.create_lesson_plan(context: "ordering at a night market", source_lang: "en", target_lang: "zh", level: 2) do |event|
  case event
  in Lingara::CreateLessonPlanEventStarted => started then puts "plan #{started.data.plan_id}"
  in Lingara::CreateLessonPlanEventPhase => phase then puts "working: #{phase.data.phase}"
  in Lingara::CreateLessonPlanEventResult => result then puts "ready: #{result.data.plan.title}"
  else nil
  end
end

PHP

use Lingara\Model\LessonPlanCreateRequest;
use Lingara\Stream\CreateLessonPlanEvent;

$request = new LessonPlanCreateRequest([
    'context' => 'ordering at a night market',
    'source_lang' => 'en',
    'target_lang' => 'zh',
    'level' => 2,
]);
foreach ($client->createLessonPlan($request) as $event) {
    if ($event instanceof CreateLessonPlanEvent\Started) {
        echo 'plan ', $event->data->getPlanId(), "\n";
    } elseif ($event instanceof CreateLessonPlanEvent\Phase) {
        echo 'phase: ', $event->data->getPhase(), "\n";
    } elseif ($event instanceof CreateLessonPlanEvent\Result) {
        echo 'ready: ', $event->data->getPlan()->getTitle(), "\n";
    }
}

Pirtûkxaneyek tercîh dikî? Beşa Pirtûkxaneyan bibîne.

Mînaka streamê

event: started
data: {"plan_id":"3f1c2a9e-5b7d-4e21-9a0c-6d8e4f2b1a37"}

event: phase
data: {"phase":"selecting_vocabulary","attempt":1}

event: result
data: {"plan":{"id":"3f1c2a9e-5b7d-4e21-9a0c-6d8e4f2b1a37","status":"complete","title":"At the night market","source_lang":"en","target_lang":"zh","level":2,"created_at":"2026-09-23T10:00:00Z","completed_at":"2026-09-23T10:00:41Z","ai_generated":true,"content":{"introduction":"Order food and ask prices at a night market.","learning_objectives":["Ask how much something costs"],"vocabulary":[{"word":"多少钱","pronunciation":"duōshao qián","translation":"how much"}],"sets":[{"number":1,"questions":[{"type":"multiple_choice_word","prompt":"Which word asks for a price?","options":["多少钱","谢谢"],"answer":"多少钱","explanation":"多少钱 means how much money."}]}]}}}

Ger wergerek û referansa Îngilîzî ji hev cuda bin, referansa Îngilîzî rast e.