דלגו לתוכן

מפרט API

סימוכין מלא לנקודות הקצה של REST. למדריכים ולדוגמאות, ראו את מדריך API.

כל מה שחבר בפרויקט יכול לעשות בממשק האינטרנט זמין כאן — ה-SPA צורך את אותו ה-API הזה. פעולות הדורשות את תפקיד ה-owner מסומנות ב-(owner); כל השאר דורש רק חברוּת בפרויקט (או, עבור קריאות המסומנות ב-(viewer), כל רמת גישה).

https://eastagiletracker.com/api/v1

https://api.eastagiletracker.com/api/v1 מגיש את אותו ה-API בדיוק. כל הבקשות והתגובות הן JSON, מלבד כמה נקודות קצה של העלאת-קבצים שמקבלות multipart.

כל בקשה מאומתת שולחת מפתח API באמצעות אחד מ:

  • X-TrackerToken: <key>
  • Authorization: Bearer <key>

מפתחות משתמש מתחילים ב-ea_user_. מפתחות סוכן מתחילים ב-ea_agent_. ראו מדריך API ← שני סוגי מפתחות.

נקודות קצה ללא אימות: /openapi.json, /docs, נקודות הקצה /auth/*, וחיפושי נתוני-הסימוכין (/story_types, /story_states, /effort_scales, …). /meta הוא מאומת — כל מפתח תקף עובד, אך הוא אינו בהיקף פרויקט (מפתח סוכן הקשור לפרויקט מגיע אליו גם הוא).

שלוש רמות מהוות שער לנקודות קצה בהיקף פרויקט:

רמהמי עוברפעולות טיפוסיות
viewerviewer, member, ownerקריאות (רשימה/קבלת סיפורים, חיפוש, אנליטיקה)
membermember, ownerכל כתיבות פריטי-העבודה (סיפורים, מטלות, תגובות, …)
ownerowner בלבדהגדרות פרויקט, ניהול חברוּת, מפתחות סוכן, מחיקה, ייבוא, שובל ביקורת

לא-חבר מקבל 404 unfound_resource (לא 403) בנתיבי פרויקט, כך שמזהי פרויקט אינם ניתנים למניין.

שיטהנתיבתיאור
GET/openapi.jsonמפרט OpenAPI 3 החי. ללא אימות.
GET/docsSwagger UI. ללא אימות.
GET/metaזהות הקורא (auth.kind/key_id/agent_id/project_id) + גרף המעברים לכל-סוג-סיפור. מאומת (כל מפתח תקף; לא בהיקף פרויקט). קראו לזה תחילה.

אלה פועלים על הקורא ודורשים רק מפתח תקף (ללא תפקיד פרויקט).

שיטהנתיבתיאור
POST/auth/registerרישום חשבון חדש
POST/auth/loginהתחברות, מחזיר אסימון מפגש
POST/auth/logoutהתנתקות
POST/auth/forgot-passwordבקשת דוא”ל לאיפוס סיסמה
POST/auth/reset-passwordשימוש באסימון איפוס לקביעת סיסמה חדשה
GET/auth/verify-emailאימות כתובת דוא”ל
POST/auth/accept-invite/lookupפתרון אסימון הזמנה → דוא”ל (ללא אימות)
POST/auth/accept-inviteקבלת הזמנה לפרויקט (לאחר אימות)
GET/meפרופיל המשתמש הנוכחי
PUT/meעדכון פרופיל
DELETE/meמחיקת חשבון
PUT/me/passwordשינוי סיסמה
PUT/me/settingsעדכון הגדרות (ערכת נושא, העדפות התראות)
POST/me/avatarהעלאת אווטר (multipart)
POST/me/api-token/regenerateסבב של אסימון ה-API שלכם — מבטל מפגשים/מפתחות קיימים
GET/me/api_keys · POST /me/api_keys · DELETE /me/api_keys/{id}ניהול מפתחות API של משתמש (ea_user_)
GET/me/activityהפעילות שלכם בכל הפרויקטים
GET/me/data-exportייצוא-עצמי של הנתונים שלכם לפי GDPR
GET/me/consent · POST /me/consentקריאה / רישום הסכמה ({ consent_type, granted })
GET/legal/pending · POST /legal/acceptמסמכי clickwrap ממתינים / רישום קבלה
POST/contact · POST /feedback · POST /feedback/with-screenshotיצירת קשר + משוב בתוך האפליקציה

נתוני סימוכין (ללא אימות)

Section titled “נתוני סימוכין (ללא אימות)”

חיפושי seed המשמשים ביצירת/הערכת סיפורים. מזהים יציבים.

שיטהנתיבתיאור
GET/story_typesfeature, bug, chore, release (+ allow_points)
GET/story_statesunstarted … accepted, rejected
GET/effort_scalesסולמות הערכה זמינים
GET/effort_scales/{scale_id}/valuesערכי הנקודות בסולם
שיטהנתיבתיאור
GET/projectsרשימת הפרויקטים שלכם
POST/projectsיצירת פרויקט
GET/projects/{id}קבלת פרטי פרויקט (viewer)
PUT/projects/{id}עדכון הגדרות פרויקט (owner)
DELETE/projects/{id}מחיקת פרויקט (owner)
GET/projects/{id}/audit-logזרם פעילות הפרויקט (owner)
GET/projects/{id}/eventsזרם אירועים מדופדף-cursor (viewer) — ראו Events
שיטהנתיבתיאור
GET/projects/{id}/membershipsרשימת חברים (viewer)
POST/projects/{id}/membershipsהזמנת חבר בדוא”ל (owner)
PUT/projects/{id}/memberships/{mid}עדכון תפקיד (owner)
DELETE/projects/{id}/memberships/{mid}הסרת חבר (owner)
GET / POST/projects/{id}/agent_keysרשימה / טביעת מפתחות סוכן (owner)
DELETE/projects/{id}/agent_keys/{kid}ביטול מפתח סוכן (owner)

כל כתיבות הסיפור דורשות את תפקיד ה-member.

שיטהנתיבתיאור
GET/projects/{id}/storiesרשימת סיפורים (מדופדף, ניתן לסינון) (viewer)
POST/projects/{id}/storiesיצירת סיפור
GET/projects/{id}/stories/{sid}קבלת סיפור אחד (viewer)
PUT/projects/{id}/stories/{sid}עדכון סיפור
DELETE/projects/{id}/stories/{sid}מחיקת סיפור
POST/projects/{id}/stories/{sid}/transitionsשינוי מצב עם אימות
POST/projects/{id}/stories/bulk_transitionמעבר של סיפורים רבים (1–100) בבת אחת
POST/projects/{id}/stories/bulk-deleteמחיקת סיפורים רבים
POST/projects/{id}/stories/bulk-duplicateשכפול סיפורים רבים
POST/projects/{id}/stories/{sid}/duplicateשכפול סיפור אחד

יצירה (POST …/stories): { "name" (חובה), "story_type": "feature|bug|chore|release", "description"?, "estimate"?, "current_state"?, "icebox"?, "labels"? }. labels מקבל ["auth"] או [{ "name": "auth" }]; תוויות לא-מוכרות נוצרות. ברירות מחדל: story_type=feature, current_state=unstarted.

עדכון (PUT …/stories/{sid}): אותם שדות, כולם אופציונליים, בתוספת "position" (float) ו-"force_state_change" (bool).

מעבר (POST …/transitions): { "to": "<state>", "reason"? }. השדה הוא to. מחזיר { story_id, state }. תנועה לא-חוקית → 422 invalid_transition עם details: { from, to, allowed }.

מעבר קבוצתי (POST …/bulk_transition): { "story_ids": [int,…] (1–100), "to": "<state>", "reason"? }. כל סיפור נשפט באופן עצמאי; מחזיר { results: [ { id, status: "ok" } | { id, status: "failed", error } ] }.

כולם member. רשימה/GET על רובם הוא (viewer).

שיטהנתיבגוף / הערות
GET / POST/projects/{id}/stories/{sid}/tasks · PUT/DELETE …/tasks/{tid}{ description (or task_desc), complete?, task_order? }
GET / POST/projects/{id}/stories/{sid}/comments · PUT/DELETE …/comments/{cid}{ text (or comment_text) } או { comment_emoji }
GET / POST/projects/{id}/stories/{sid}/blockers · PUT/DELETE …/blockers/{bid}{ blocker_desc, resolved? }
GET / POST/projects/{id}/stories/{sid}/links · DELETE …/links/{lid}{ url, link_type?, title? }
GET / POST/projects/{id}/stories/{sid}/reviews · PUT/DELETE …/reviews/{rid}{ reviewer_id? / reviewer_agent_id?, status, comment? }
GET / POST/projects/{id}/stories/{sid}/owners · DELETE …/owners/{mid} · DELETE …/owners/agents/{aid}{ member_id? / agent_id? } — השמיטו את שניהם כדי להוסיף את הקורא
GET / POST/projects/{id}/stories/{sid}/followers · DELETE …/followers/{mid} · DELETE …/followers/agents/{aid}{ member_id? / agent_id? }
GET / POST/projects/{id}/stories/{sid}/labels · DELETE …/labels/{lid}{ name }
GET / POST/projects/{id}/stories/{sid}/attachments (+ /json) · DELETE …/attachments/{aid}העלאת multipart (≤ 2 GB כל אחד); רשימה היא (viewer)

member לכתיבות, (viewer) לקריאות.

שיטהנתיבתיאור
GET / POST/projects/{id}/labelsרשימה / יצירת תווית
PUT / DELETE/projects/{id}/labels/{lid}עדכון / מחיקת תווית
POST/projects/{id}/labels/{lid}/archiveארכוב (הסתרה רכה) של תווית
שיטהנתיבתיאור
GET/projects/{id}/iterationsרשימת איטרציות (member)
POST/projects/{id}/iterationsיצירת איטרציה ידנית (owner)
DELETE/projects/{id}/iterations/{itid}מחיקת איטרציה (owner)

חיפוש, אנליטיקה, מדדים, העדפות

Section titled “חיפוש, אנליטיקה, מדדים, העדפות”
שיטהנתיבתיאור
GET/projects/{id}/search?query=…חיפוש בתחביר סינון (viewer) — ראו מדריך
GET/projects/{id}/analytics/{overview,iteration,releases,activity,cycle-time,projections}אנליטיקה (viewer). צלילה לעומק לאיטרציה מקבלת ?iteration_id=
GET/projects/{id}/metrics/{velocity,burndown,story-types}מדדים (viewer)
GET / PUT/projects/{id}/preferencesהעדפות הלוח שלכם לפרויקט זה (member)
שיטהנתיבתיאור
GET/projects/{id}/eventsזרם אירועים מדופדף-cursor (viewer)

פרמטרי שאילתה: since=<event_id>, types=story.created,story.transitioned,comment.created,…, limit=, cursor=. התגובה כוללת next_cursor. העבירו את ה-event_id האחרון שראיתם כ-since כדי להמשיך.

שיטהנתיבתיאור
POST/projects/{id}/import (+ /json)העלאת multipart. source=pivotal, jira, asana, gitlab, shortcut, trello, linear, plane, plane_json.
wss://eastagiletracker.com/ws/control?token=<key>

לשליטה מרחוק אינטראקטיבית בממשק המשתמש ({ "action": "get_state", "id": "req-1" }). אינו ערוץ נתונים — כל הקריאות/הכתיבות עוברות דרך REST. מופע יחיד בלבד; אינו מתפרס על פני רפליקות.

נקודות קצה של כתיבה (POST, PUT, DELETE) מקבלות כותרת Idempotency-Key. אותו מפתח + אותו גוף משמיע מחדש את התגובה השמורה (חלון של 24 שעות); אותו מפתח + גוף שונה מחזיר 409 idempotency_conflict. אינו חל על GET/HEAD/OPTIONS, /auth/*, או נתיבי /attachments. תגובות 5xx לעולם אינן נשמרות — ניסיון חוזר מגיע ל-handler.

נקודות קצה של רשימה מקבלות cursor=<opaque> ו-limit=<n≤200>. כשהוגדר, התגובה היא { "items": [...], "next_cursor": "<str|null>" }; העבירו את next_cursor בחזרה כדי לדפדף. חלק מהרשימות גם מחזירות כותרת X-Tracker-Pagination-Total.

נקודות קצה של רשימה מקבלות fields= (מופרד בפסיקים) כדי להחזיר רק שדות מסוימים. story_id תמיד נכלל; שם שדה לא-מוכר מחזיר 400 validation_failed עם השמות הפוגעים ב-details.fields.

GET /projects/123/stories?fields=story_id,name,current_state,owners

לכל שגיאת JSON יש code ו-error; חלק מוסיפות details:

{ "code": "invalid_transition",
"error": "Cannot move story from `unstarted` to `accepted`",
"details": { "from": "unstarted", "to": "accepted", "allowed": ["started"] } }
סטטוסcodeמתי
400invalid_parameterקלט שגוי; הודעה ב-error, ללא details (רוב האימות: ריק/אורך/null-byte/דוא”ל)
400validation_failedשגיאת קלט מובְנית; details.fields הוא מערך של שמות שדות פוגעים
401unauthenticatedאסימון חסר/לא-תקף
403unauthorized_operationמאומת אך תפקיד לא-מספיק
404unfound_resourceלא נמצא — מוחזר גם ללא-חברים
409conflictהתנגשות משאב (למשל כפילות)
409idempotency_conflictIdempotency-Key נעשה בו שימוש חוזר עם גוף שונה
422invalid_transitionתנועת מצב לא-חוקית; details נושא { from, to, allowed }
500internal_errorתקלת שרת — הודעה כללית; בטוח לנסות שוב

details.fields הוא מערך JSON של שמות שדות (למשל ["to"]), לעיתים עם מפתחות נוספים כמו max. אין מפת שדה→הודעה.

{ "code": "validation_failed", "error": "unknown field(s): foo", "details": { "fields": ["foo"] } }

לכל-מפתח (לכל-IP עבור נקודות קצה ללא אימות), דלי אסימונים GCRA:

  • Auth/auth/*: 0.5 בקשות/שנייה, פרץ 20.
  • Public/contact, /feedback: 0.2 בקשות/שנייה, פרץ 10.
  • רגיש — איפוס-סיסמה: ~0.002 בקשות/שנייה, פרץ 5.

מגבלה שנחרגה מחזירה 429 Too Many Requests עם כותרת Retry-After וגוף טקסט-רגיל (לא מעטפת שגיאת ה-JSON).