Aller au contenu
सार्वजनिक API · मुफ़्त

YA-Planning API दस्तावेज़

समय-सारणियों की जनरेशन और अवलोकन को एकीकृत करें, अपने संस्थानों का कॉन्फ़िगरेशन प्रबंधित करें और रियल-टाइम में इवेंट प्राप्त करें। पूर्ण संदर्भ, उदाहरण और सैंडबॉक्स।

परिचय

API REST है, JSON में, संस्करणित। सभी व्यावसायिक संसाधन /api/v1/pub/v1 उपसर्ग के अंतर्गत रहते हैं। सार्वजनिक प्रदर्शन एंडपॉइंट /api/v1/public/api-demo के अंतर्गत हैं।

  • Base URL : https://votre-domaine/api/v1/pub/v1
  • प्रारूप: अनुरोध और प्रतिक्रियाएँ application/json में (ICS/PDF निर्यात को छोड़कर)।
  • संस्करणन: संस्करण पथ में है (/v1); पश्च-संगत परिवर्धन संस्करण नहीं बदलते।
  • CORS : सार्वजनिक API तृतीय-पक्ष ब्राउज़र अनुप्रयोगों के लिए खुली है (बिना कुकीज़)।

प्रमाणीकरण

प्रत्येक अनुरोध एक API कुंजी वहन करता है, दो में से किसी एक हेडर में:

X-API-Key: yap_live_xxxxxxxxxxxxxxxxxxxx
# ou
Authorization: Bearer yap_live_xxxxxxxxxxxxxxxxxxxx

एक कुंजी अनेक संस्थानों के लिए अधिकृत हो सकती है (एंटरप्राइज़ कुंजी)। तब लक्ष्य को X-Etablissement-Id हेडर के माध्यम से निर्दिष्ट करें; यदि केवल एक ही अधिकृत संस्थान है, तो वह स्वचालित रूप से अनुमानित हो जाता है। कुंजियाँ, स्कोप के साथ, कंसोल में बनाई जाती हैं।

एनवायरनमेंट और सैंडबॉक्स

दो एनवायरनमेंट, कुंजी के उपसर्ग द्वारा विभेदित:

  • yap_live_… — production : आपका वास्तविक डेटा; जनरेशन साप्ताहिक कोटा से घटाता है।
  • yap_test_… — sandbox : पठन एक डेमो डेटासेट लौटाते हैं (कभी भी आपका वास्तविक डेटा नहीं), जनरेशन घटाई नहीं जाती, और कॉन्फ़िगरेशन लेखन अस्वीकृत होता है (SANDBOX_READONLY)। बिना जोखिम विकास के लिए आदर्श।

स्कोप

प्रत्येक कुंजी स्कोप का एक उपसमुच्चय वहन करती है; यदि आवश्यक स्कोप अनुपस्थित हो तो एक एंडपॉइंट अस्वीकार करता है (403 INSUFFICIENT_SCOPE)।

config:readचक्र, कक्षाएँ, विषय, शिक्षक, समय-खंड, घंटे-भार पढ़ें।
config:writeसंस्थान का कॉन्फ़िगरेशन बनाएँ / संशोधित करें / मिटाएँ।
timetables:readजॉब सूचीबद्ध करें, परिणाम और प्रकाशित समय-सारणियाँ पढ़ें, निर्यात करें।
timetables:writeएक जनरेशन शुरू करें और एक समय-सारणी प्रकाशित करें।
webhooks:manageवेबहुक एंडपॉइंट बनाएँ, सूचीबद्ध करें और मिटाएँ।
establishments:manageअपने संस्थान बनाएँ और सूचीबद्ध करें (खाता स्तर, बिना X-Etablissement-Id)।

दर और कोटा

प्रत्येक कुंजी की एक दर सीमा होती है (डिफ़ॉल्ट 60 req/min)। प्रतिक्रियाएँ वहन करती हैं:

X-RateLimit-Limit: 60
X-RateLimit-Remaining: 59
X-RateLimit-Reset: 1783919311   # epoch (s) de réinitialisation

अधिकता Retry-After हेडर के साथ 429 RATE_LIMITED लौटाती है। समय-सारणी जनरेशन इसके अतिरिक्त पैकेज के साप्ताहिक कोटा के अधीन है (/me के माध्यम से दृश्यमान)।

API की प्रत्येक प्रतिक्रिया एक X-Request-Id हेडर भी वहन करती है (सहसंबंध पहचानकर्ता) — किसी घटना की स्थिति में इसे सहायता को बताएँ। नोट: दर की गणना वर्तमान में प्रति इंस्टेंस लागू की जाती है; बहु-इंस्टेंस परिनियोजन पर प्रभावी सीमा प्रदर्शित मान का गुणज हो सकती है।

त्रुटियाँ

एकसमान त्रुटि आवरण, सहायता के लिए एक requestId के साथ:

{ "error": "INSUFFICIENT_SCOPE", "message": "Scope requis : config:write.",
  "requestId": "6181762d-…", "requiredScope": "config:write" }
कोडerrorकारण
400BAD_REQUESTअनुपस्थित या अमान्य पैरामीटर।
401UNAUTHORIZED / INVALID_API_KEYकुंजी अनुपस्थित, अमान्य या निरस्त।
403INSUFFICIENT_SCOPEकुंजी के पास आवश्यक स्कोप नहीं है।
403ETABLISSEMENT_NOT_GRANTEDकुंजी अनुरोधित संस्थान के लिए अधिकृत नहीं है।
403SANDBOX_READONLYसैंडबॉक्स कुंजी के साथ लेखन निषिद्ध (केवल-पठन)।
402PLAN_UPGRADE_REQUIREDसशुल्क पैकेज के लिए आरक्षित सुविधा (उदा. iCal निर्यात)।
404NOT_FOUNDसंसाधन अस्तित्वहीन या आपके संस्थान के बाहर।
409WORKFLOW_ERRORवर्कफ़्लो परिवर्तन असंभव (उदा. किसी मसौदे को प्रकाशित करना)।
429RATE_LIMITEDदर पार हुई — Retry-After हेडर के बाद पुनः प्रयास करें।

सीधे लाइव परीक्षण करें — बिना पंजीकरण

सार्वजनिक प्रदर्शन एंडपॉइंट (कोई कुंजी आवश्यक नहीं)।

OpenAPI डाउनलोड करें

Postman : « Import » → « Link » → /q/openapi?format=json पेस्ट करें।

संदर्भ — खाता और आत्मनिरीक्षण

GET/me

वर्तमान कुंजी का विवरण: एनवायरनमेंट, लक्ष्य संस्थान, प्रदत्त स्कोप और शेष जनरेशन कोटा। कोई स्कोप आवश्यक नहीं।

प्रतिक्रिया
{
  "environment": "LIVE",
  "etablissementId": "61a9…8cb",
  "scopes": ["config:read", "timetables:write"],
  "entitlements": {
    "plan": "PRO",
    "generationsRestantes": -1,
    "resetLe": "2026-07-14T00:00:00Z",
    "maxClassesExport": -1
  }
}
GET/me/etablissement

लक्ष्य संस्थान की सार्वजनिक प्रोफ़ाइल: नाम, संक्षिप्ताक्षर, शहर, देश, प्रकार, वेबसाइट। कोई स्कोप आवश्यक नहीं।

प्रतिक्रिया
{"id":"…","nom":"Groupe Scolaire Les Palmiers","slug":"gs-palmiers","sigle":"GSP","ville":"Abidjan","pays":"CI","type":"PRIVE","siteWeb":"https://…"}
GET/me/usage

वर्तमान कुंजी का हालिया उपयोग (प्रति दिन कॉल और त्रुटियाँ)। कोई स्कोप आवश्यक नहीं।

पैरामीटर:
  • days — दिनों में विंडो (डिफ़ॉल्ट 30, अधिकतम 90)
प्रतिक्रिया
{"apiKeyId":"…","days":30,"daily":[{"day":"2026-07-12","calls":128,"errors":3}]}

संदर्भ — खाता — संस्थान

खाता-स्तर प्रावधान: X-Etablissement-Id हेडर के बिना अपने स्वयं के संस्थान बनाएँ (/account पथ किसी संस्थान से जुड़ा नहीं है)। स्कोप establishments:manage। निर्माण पर, कॉल करने वाली कुंजी को नए संस्थान पर स्वचालित रूप से एक ACTIVE grant मिलता है — फिर उसे कॉन्फ़िगर और जनरेट करने के लिए X-Etablissement-Id का उपयोग करें।

POST/account/etablissementsestablishments:manage

एक संस्थान बनाएँ (डेवलपर बकेट, आपके खाते की सीमा के अधीन)।

बॉडी
{"nom":"Groupe Scolaire Les Palmiers","type":"PRIVE_LAIC","pays":"CI"}
प्रतिक्रिया
{"id":"…","nom":"Groupe Scolaire Les Palmiers","slug":"gs-les-palmiers","pays":"CI","type":"PRIVE_LAIC"}
GET/account/etablissementsestablishments:manage

आपके द्वारा बनाए गए संस्थान सूचीबद्ध करें।

प्रतिक्रिया
[{"id":"…","nom":"…","slug":"…","pays":"CI","type":"PRIVE_LAIC"}]

संदर्भ — कॉन्फ़िगरेशन

संस्थान की शैक्षणिक संरचना। पठन: स्कोप config:read। लेखन: स्कोप config:write (सैंडबॉक्स में निषिद्ध)। एक नव-निर्मित संस्थान में पहले से ही एक « मुख्य चक्र » होता है।

GET/cyclesconfig:read

चक्रों की सूची।

प्रतिक्रिया
[{"id":"…","libelle":"Cycle principal","ordre":0}]
POST/cyclesconfig:write

एक चक्र बनाएँ।

बॉडी
{"libelle":"Second cycle","ordre":1}
DELETE/cycles/{id}config:write

एक चक्र मिटाएँ।

GET/niveauxconfig:read

कक्षाओं/स्तरों की सूची।

प्रतिक्रिया
[{"id":"…","libelle":"6ème 1","cycleId":"…","effectif":42,"ordre":1}]
POST/niveauxconfig:write

एक कक्षा बनाएँ।

बॉडी
{"libelle":"6ème 3","cycleId":"<uuid-cycle>","effectif":40,"ordre":3}
PUT/niveaux/{id}config:write

एक कक्षा संशोधित करें (आंशिक फ़ील्ड)।

DELETE/niveaux/{id}config:write

एक कक्षा मिटाएँ।

GET/disciplinesconfig:read

विषयों की सूची।

प्रतिक्रिया
[{"id":"…","libelle":"Mathématiques","code":"MATH","couleur":"#6C5CE7","ordre":1}]
POST/disciplinesconfig:write

एक विषय बनाएँ।

बॉडी
{"libelle":"Physique-Chimie","code":"PC","couleur":"#00B894","ordre":5}
PUT/disciplines/{id}config:write

एक विषय संशोधित करें।

DELETE/disciplines/{id}config:write

एक विषय मिटाएँ।

GET/professeursconfig:read

शिक्षकों की सूची।

प्रतिक्रिया
[{"id":"…","nom":"Koné","prenoms":"Awa","matricule":"P-0142","email":"…","telephone":"…","nombreHeureAutorise":18,"statut":"TITULAIRE","actif":true}]
POST/professeursconfig:write

एक शिक्षक बनाएँ।

बॉडी
{"nom":"Diarra","prenoms":"Sékou","matricule":"P-0210","email":"s.diarra@ecole.ci","nombreHeureAutorise":18,"statut":"VACATAIRE","actif":true}
PUT/professeurs/{id}config:write

एक शिक्षक संशोधित करें।

DELETE/professeurs/{id}config:write

एक शिक्षक मिटाएँ।

GET/horairesconfig:read

ग्रिड के समय-खंड।

प्रतिक्रिया
[{"id":"…","jour":"MONDAY","heureDebut":"08:00","heureFin":"09:00","estPause":false,"libelle":null}]
POST/horairesconfig:write

एक समय-खंड बनाएँ (दिन, HH:mm)।

बॉडी
{"jour":"MONDAY","heureDebut":"08:00","heureFin":"09:00","estPause":false,"libelle":"M1"}
DELETE/horaires/{id}config:write

एक समय-खंड मिटाएँ।

GET/volumesconfig:read

घंटे-भार (विषय × चक्र)।

प्रतिक्रिया
[{"id":"…","cycleId":"…","disciplineId":"…","nombreHeuresObligatoire":4,"minHeuresConsecutives":1,"maxHeuresConsecutives":2}]
POST/volumesconfig:write

एक घंटे-भार बनाएँ।

बॉडी
{"cycleId":"<uuid>","disciplineId":"<uuid>","nombreHeuresObligatoire":4,"minHeuresConsecutives":1,"maxHeuresConsecutives":2}
DELETE/volumes/{id}config:write

एक घंटे-भार मिटाएँ।

संदर्भ — समय-सारणियाँ

अतुल्यकालिक जनरेशन (सॉल्वर पृष्ठभूमि कार्य में चलता है — स्थिति जाँचें), प्रकाशन और अवलोकन। सैंडबॉक्स में, जनरेशन एक डेमो डेटासेट का उपयोग करता है और कोटा से घटाया नहीं जाता।

POST/timetables/generatetimetables:write

एक जनरेशन शुरू करता है। 202 + जाँचने के लिए एक jobId लौटाता है। LIVE साप्ताहिक कोटा से घटाता है। वैकल्पिक Idempotency-Key हेडर: एक ही पहचानकर्ता नई जनरेशन शुरू करने के बजाय संग्रहीत प्रतिक्रिया को दोहराता है (प्रतिक्रिया Idempotency-Replayed: true से चिह्नित)।

पैरामीटर:
  • Idempotency-Key — हेडर (वैकल्पिक) — LIVE की ओर idempotency कुंजी
बॉडी
{"durationMinutes": 5}
प्रतिक्रिया
{"jobId":"…","status":"SOLVING_SCHEDULED"}
GET/timetables/jobstimetables:read

जॉब की पेजिनेटेड सूची।

पैरामीटर:
  • page — पेज सूचकांक (डिफ़ॉल्ट 0)
  • size — आकार (डिफ़ॉल्ट 25, अधिकतम 100)
प्रतिक्रिया
{"items":[{"jobId":"…","name":"…","status":"SOLVING_ENDED","workflowStatus":"BROUILLON","feasible":true,"hardScore":0,"softScore":-42,"createdAt":"…"}],"total":7,"page":0,"size":25}
GET/timetables/jobs/{jobId}timetables:read

किसी जॉब की स्थिति।

GET/timetables/jobs/{jobId}/resulttimetables:read

परिणाम: पाठों की सूची (एक बार status = SOLVING_ENDED)।

प्रतिक्रिया
{"jobId":"…","status":"SOLVING_ENDED","feasible":true,"lessons":[{"id":"1","matiere":"Maths","niveau":"6ème 1","professeur":"M. Koné","jour":"MONDAY","debut":"08:00:00","fin":"09:00:00","couleur":"#6C5CE7","niveauOrdre":1,"verrouille":false}]}
POST/timetables/jobs/{jobId}/publishtimetables:write

समय-सारणी प्रकाशित करता है (workflow → PUBLIE)। वेबहुक इवेंट timetable.published ट्रिगर करता है।

GET/timetables/published/latesttimetables:read

संस्थान की अंतिम प्रकाशित समय-सारणी।

GET/timetables/published/{jobId}/classestimetables:read

किसी प्रकाशित समय-सारणी में मौजूद कक्षाओं के लेबल।

प्रतिक्रिया
{"classes":["6ème 1","6ème 2","5ème 1"]}
GET/timetables/published/{jobId}/classe/{niveau}timetables:read

किसी प्रकाशित समय-सारणी की एक कक्षा के पाठ।

GET/timetables/jobs/{jobId}/export.icstimetables:read

iCalendar निर्यात (text/calendar)। Pro पैकेज के लिए आरक्षित → अन्यथा 402।

पैरामीटर:
  • niveau — किसी कक्षा पर फ़िल्टर करें
  • professeur — किसी शिक्षक पर फ़िल्टर करें
GET/timetables/jobs/{jobId}/export.pdftimetables:read

PDF निर्यात (application/pdf) — सभी कक्षाएँ, कक्षा या शिक्षक अनुसार।

पैरामीटर:
  • mode — all | class | teacher
  • niveau — mode=class होने पर आवश्यक
  • professeur — mode=teacher होने पर आवश्यक

संदर्भ — वेबहुक

हस्ताक्षरित इवेंट प्राप्त करें। स्कोप webhooks:manage। गुप्त कुंजी केवल निर्माण पर (या रोटेशन के बाद) लौटाई जाती है। इवेंट: timetable.job.completed, timetable.job.failed, timetable.published, webhook.test। प्रत्येक डिलीवरी हस्ताक्षरित (HMAC-SHA256) होती है और विफलता की स्थिति में 5 बार तक दोहराई जाती है। URL को SSRF के विरुद्ध सत्यापित किया जाता है (आंतरिक/निजी लक्ष्य अस्वीकृत)।

GET/webhookswebhooks:manage

एंडपॉइंट की सूची।

POST/webhookswebhooks:manage

एक एंडपॉइंट बनाएँ। हस्ताक्षर गुप्त कुंजी लौटाता है (सहेजकर रखें)।

बॉडी
{"url":"https://exemple.com/webhooks/yap","events":["timetable.published","timetable.job.completed"]}
प्रतिक्रिया
{"endpoint":{"id":"…","url":"…","events":["timetable.published"],"active":true},"secret":"whsec_…"}
DELETE/webhooks/{id}webhooks:manage

एक एंडपॉइंट मिटाएँ।

GET/webhooks/{id}/deliverieswebhooks:manage

डिलीवरी लॉग (स्थिति, HTTP कोड, प्रयास)।

POST/webhooks/{id}/rotatewebhooks:manage

हस्ताक्षर गुप्त कुंजी पुनः जनरेट करें (केवल एक बार लौटाई जाती है)।

प्रतिक्रिया
{"endpoint":{"id":"…","url":"…"},"secret":"whsec_…"}
POST/webhooks/{id}/testwebhooks:manage

एंडपॉइंट को एक webhook.test इवेंट भेजें (202 + status queued)।

POST/webhooks/deliveries/{deliveryId}/replaywebhooks:manage

किसी पूर्व डिलीवरी को दोहराएँ (202 + status queued)।

संदर्भ — डेमो (सार्वजनिक, बिना कुंजी)

प्रतिक्रियाओं का स्वरूप जानने के लिए अप्रमाणित सार्वजनिक एंडपॉइंट।

GET/api/v1/public/api-demo/preview

एक डेमो संस्थान का पूर्वावलोकन (चक्र, कक्षाएँ, विषय, शिक्षक, समय-खंड)।

GET/api/v1/public/api-demo/sample-timetable

पाठों का उदाहरण (एक जनरेट की गई समय-सारणी का स्वरूप)।

वेबहुक — हस्ताक्षर सत्यापित करें

प्रत्येक डिलीवरी एक POST JSON है जिसमें X-Webhook-Event, X-Webhook-Timestamp और X-Webhook-Signature = HMAC-SHA256(timestamp + "." + body, secret) हेडर होते हैं। रीप्ले से बचने के लिए हस्ताक्षर और timestamp की ताज़गी (5 मिनट से कम) सत्यापित करें। इवेंट : timetable.published, timetable.job.completed, timetable.job.failed, webhook.test।

POST https://votre-app/webhook
X-Webhook-Event: timetable.published
X-Webhook-Timestamp: 1712345678
X-Webhook-Signature: 9f86d081…

{ "event":"timetable.published", "jobId":"…", "etablissementId":"…", "occurredAt":"…" }
import crypto from "crypto";

// Express — vérifier la signature d'un webhook YA-Planning
app.post("/webhooks/yap", express.raw({ type: "*/*" }), (req, res) => {
  const ts  = req.header("X-Webhook-Timestamp");
  const sig = req.header("X-Webhook-Signature");
  const body = req.body.toString("utf8");

  const expected = crypto.createHmac("sha256", process.env.YAP_WEBHOOK_SECRET)
    .update(`${ts}.${body}`).digest("hex");

  // fraîcheur (anti-rejeu) : < 5 min
  const fresh = Math.abs(Date.now()/1000 - Number(ts)) < 300;
  if (!fresh || !crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected)))
    return res.sendStatus(400);

  const event = JSON.parse(body); // { event, jobId, etablissementId, occurredAt }
  res.sendStatus(200);
});

कोड उदाहरण

# Vérifier ses droits
curl https://votre-domaine/api/v1/pub/v1/me \
  -H "X-API-Key: yap_live_xxxxxxxxxxxx"

# Générer un EDT puis suivre le job
JOB=$(curl -s -X POST .../api/v1/pub/v1/timetables/generate \
  -H "X-API-Key: yap_live_xxxx" -H "Content-Type: application/json" \
  -d '{"durationMinutes":5}' | jq -r .jobId)

curl .../api/v1/pub/v1/timetables/jobs/$JOB \
  -H "X-API-Key: yap_live_xxxx"

संस्करण और अवमूल्यन

API पथ में संस्करणित है (/api/v1/pub/v1/…)। हम फ़ील्ड और एंडपॉइंट पश्च-संगत तरीके से जोड़ते हैं; ये परिवर्धन कोई विच्छेद नहीं हैं, इसलिए सहिष्णु तरीके से कोड करें (अज्ञात फ़ील्ड को अनदेखा करें)। कोई भी विच्छेद एक नए प्रमुख संस्करण और कम से कम 90 दिनों की पूर्व-सूचना को जन्म देगा, जो Deprecation प्रतिक्रिया हेडर और नीचे दिए परिवर्तन-लॉग के माध्यम से घोषित की जाएगी।

परिवर्तन-लॉग
  • 2026-07 — डेवलपर खाते और डैशबोर्ड; खाता-स्तर प्रावधान (POST /account/etablissements, स्कोप establishments:manage); /cycles एंडपॉइंट; PDF निर्यात mode=teacher।
  • 2026-07 — जनरेशन पर Idempotency-Key; /me/etablissement, /me/usage एंडपॉइंट; वेबहुक का रोटेशन / परीक्षण / रीप्ले; timetable.job.failed इवेंट; X-Request-Id हेडर; कॉन्फ़िगरेशन सूचियों का पेजिनेशन; कुंजियों की समाप्ति और IP प्रतिबंध; वेबहुक URL का एंटी-SSRF सत्यापन।
  • 2026-06 — सार्वजनिक API v1 का शुभारंभ: स्कोप वाली कुंजियाँ, कॉन्फ़िगरेशन, समय-सारणी जनरेशन और प्रकाशन, हस्ताक्षरित वेबहुक, सैंडबॉक्स, कोटा हेडर।

एकीकृत करने के लिए तैयार हैं?

30 सेकंड में एक सैंडबॉक्स कुंजी बनाएँ और अपनी पहली कॉल करें।

API कंसोल खोलें