ข้ามไปยังเนื้อหา

ข้อกำหนด API

เอกสารอ้างอิง endpoint REST ฉบับสมบูรณ์ สำหรับบทเรียนและตัวอย่าง ดู คู่มือ API

ทุกอย่างที่ สมาชิก (member) ของโปรเจกต์ทำได้ใน UI เว็บ มีให้ใช้ที่นี่ — SPA ใช้ API เดียวกันนี้ การดำเนินการที่ต้องการบทบาท เจ้าของ (owner) ถูกทำเครื่องหมาย (owner) ทุกอย่างที่เหลือต้องการเพียงสมาชิกภาพโปรเจกต์ (หรือสำหรับการอ่านที่ทำเครื่องหมาย (viewer) ต้องการระดับการเข้าถึงใดก็ได้)

https://eastagiletracker.com/api/v1

https://api.eastagiletracker.com/api/v1 ให้บริการ API ที่เหมือนกัน คำขอและการตอบกลับทั้งหมดเป็น JSON ยกเว้น endpoint อัปโหลดไฟล์ไม่กี่ตัวที่รับ multipart

ทุกคำขอที่ยืนยันตัวตนส่งคีย์ API ผ่านหนึ่งใน:

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

คีย์ผู้ใช้ขึ้นต้นด้วย ea_user_ คีย์เอเจนต์ขึ้นต้นด้วย ea_agent_ ดู คู่มือ API → คีย์สองชนิด

endpoint ที่ไม่ต้องยืนยันตัวตน: /openapi.json, /docs, endpoint /auth/* และการค้นหาข้อมูลอ้างอิง (/story_types, /story_states, /effort_scales, …) /meta ต้องยืนยันตัวตน — คีย์ที่ถูกต้องใด ๆ ใช้ได้ แต่มันไม่ได้กำหนดขอบเขตรายโปรเจกต์ (คีย์เอเจนต์ที่ผูกกับโปรเจกต์ก็เข้าถึงมันได้)

สามระดับเป็นด่านสำหรับ endpoint ที่กำหนดขอบเขตรายโปรเจกต์:

ระดับใครผ่านการดำเนินการทั่วไป
viewerviewer, member, ownerการอ่าน (list/get story, ค้นหา, การวิเคราะห์)
membermember, ownerการเขียน work-item ทั้งหมด (story, task, comment, …)
ownerowner เท่านั้นการตั้งค่าโปรเจกต์ การจัดการสมาชิกภาพ คีย์เอเจนต์ การลบ การนำเข้า บันทึกการตรวจสอบ

ผู้ที่ไม่ใช่สมาชิกจะได้รับ 404 unfound_resource (ไม่ใช่ 403) บน path ของโปรเจกต์ ดังนั้น ID ของโปรเจกต์จึงนับลำดับไม่ได้

MethodPathคำอธิบาย
GET/openapi.jsonข้อกำหนด OpenAPI 3 แบบสด ไม่ต้องยืนยันตัวตน
GET/docsSwagger UI ไม่ต้องยืนยันตัวตน
GET/metaตัวตนของผู้เรียก (auth.kind/key_id/agent_id/project_id) + กราฟการเปลี่ยนสถานะรายประเภท story ต้องยืนยันตัวตน (คีย์ที่ถูกต้องใด ๆ ไม่กำหนดขอบเขตรายโปรเจกต์) เรียกสิ่งนี้ก่อน

สิ่งเหล่านี้ทำหน้าที่กับผู้เรียกและต้องการเพียงคีย์ที่ถูกต้อง (ไม่มีบทบาทโปรเจกต์)

MethodPathคำอธิบาย
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ติดต่อ + ฟีดแบ็กในแอป

การค้นหา seed ที่ใช้เมื่อสร้าง/ประเมิน story ID เสถียร

MethodPathคำอธิบาย
GET/story_typesfeature, bug, chore, release (+ allow_points)
GET/story_statesunstarted … accepted, rejected
GET/effort_scalesมาตรวัดการประเมินที่มีให้
GET/effort_scales/{scale_id}/valuesค่าแต้มในมาตรวัด
MethodPathคำอธิบาย
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
MethodPathคำอธิบาย
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)

การเขียน story ทั้งหมดต้องการบทบาท member

MethodPathคำอธิบาย
GET/projects/{id}/storiesแสดงรายการ story (แบ่งหน้า กรองได้) (viewer)
POST/projects/{id}/storiesสร้าง story
GET/projects/{id}/stories/{sid}ดู story หนึ่งอัน (viewer)
PUT/projects/{id}/stories/{sid}อัปเดต story
DELETE/projects/{id}/stories/{sid}ลบ story
POST/projects/{id}/stories/{sid}/transitionsเปลี่ยนสถานะพร้อมการตรวจสอบ
POST/projects/{id}/stories/bulk_transitionเปลี่ยนสถานะหลาย story (1–100) พร้อมกัน
POST/projects/{id}/stories/bulk-deleteลบหลาย story
POST/projects/{id}/stories/bulk-duplicateทำซ้ำหลาย story
POST/projects/{id}/stories/{sid}/duplicateทำซ้ำ story หนึ่งอัน

Create (POST …/stories): { "name" (required), "story_type": "feature|bug|chore|release", "description"?, "estimate"?, "current_state"?, "icebox"?, "labels"? } labels รับ ["auth"] หรือ [{ "name": "auth" }] ป้ายกำกับที่ไม่รู้จักจะถูกสร้างขึ้น ค่าเริ่มต้น: story_type=feature, current_state=unstarted

Update (PUT …/stories/{sid}): ฟิลด์เดียวกัน ทั้งหมดไม่บังคับ บวก "position" (float) และ "force_state_change" (bool)

Transition (POST …/transitions): { "to": "<state>", "reason"? } ฟิลด์คือ to คืน { story_id, state } การย้ายที่ไม่ถูกต้อง → 422 invalid_transition พร้อม details: { from, to, allowed }

Bulk transition (POST …/bulk_transition): { "story_ids": [int,…] (1–100), "to": "<state>", "reason"? } แต่ละ story ถูกตัดสินอย่างอิสระ คืน { results: [ { id, status: "ok" } | { id, status: "failed", error } ] }

ทั้งหมดเป็น member การ List/GET ส่วนใหญ่เป็น (viewer)

MethodPathBody / หมายเหตุ
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 ต่อไฟล์) list เป็น (viewer)

member สำหรับการเขียน (viewer) สำหรับการอ่าน

MethodPathคำอธิบาย
GET / POST/projects/{id}/labelsแสดงรายการ / สร้างป้ายกำกับ
PUT / DELETE/projects/{id}/labels/{lid}อัปเดต / ลบป้ายกำกับ
POST/projects/{id}/labels/{lid}/archiveเก็บถาวร (ซ่อนแบบนุ่ม) ป้ายกำกับ
MethodPathคำอธิบาย
GET/projects/{id}/iterationsแสดงรายการรอบงาน (member)
POST/projects/{id}/iterationsสร้างรอบงานด้วยตนเอง (owner)
DELETE/projects/{id}/iterations/{itid}ลบรอบงาน (owner)
MethodPathคำอธิบาย
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)
MethodPathคำอธิบาย
GET/projects/{id}/eventsสตรีมเหตุการณ์ที่แบ่งหน้าด้วย cursor (viewer)

พารามิเตอร์คิวรี: since=<event_id>, types=story.created,story.transitioned,comment.created,…, limit=, cursor= การตอบกลับรวม next_cursor ส่ง event_id สุดท้ายที่คุณเห็นเป็น since เพื่อกลับมาทำต่อ

MethodPathคำอธิบาย
POST/projects/{id}/import (+ /json)อัปโหลด multipart source=pivotal, jira, asana, gitlab, shortcut, trello, linear, plane, plane_json
wss://eastagiletracker.com/ws/control?token=<key>

สำหรับการควบคุม UI จากระยะไกลแบบโต้ตอบ ({ "action": "get_state", "id": "req-1" }) ไม่ใช่ช่องข้อมูล — การอ่าน/เขียนทั้งหมดผ่าน REST ใช้ได้กับอินสแตนซ์เดียวเท่านั้น ไม่กระจายข้ามเรพลิกา

endpoint การเขียน (POST, PUT, DELETE) รับ header Idempotency-Key คีย์เดียวกัน + body เดียวกัน จะเล่นซ้ำการตอบกลับที่แคชไว้ (หน้าต่าง 24 ชั่วโมง) คีย์เดียวกัน + body ต่างกัน คืน 409 idempotency_conflict ไม่ใช้กับ GET/HEAD/OPTIONS, /auth/* หรือ path /attachments การตอบกลับ 5xx ไม่ถูกแคชเลย — การลองใหม่จะถึงตัวจัดการ (handler)

endpoint แบบรายการรับ cursor=<opaque> และ limit=<n≤200> เมื่อตั้งค่า การตอบกลับเป็น { "items": [...], "next_cursor": "<str|null>" } ส่ง next_cursor กลับเพื่อเลื่อนหน้า รายการบางอันยังคืน header X-Tracker-Pagination-Total ด้วย

endpoint แบบรายการรับ 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/email)
400validation_failedข้อผิดพลาดอินพุตแบบมีโครงสร้าง details.fields เป็น อาร์เรย์ ของชื่อฟิลด์ที่ผิด
401unauthenticatedโทเค็นขาดหาย/ไม่ถูกต้อง
403unauthorized_operationยืนยันตัวตนแล้วแต่บทบาทไม่เพียงพอ
404unfound_resourceไม่พบ — คืนให้ผู้ที่ไม่ใช่สมาชิกด้วย
409conflictทรัพยากรขัดแย้ง (เช่น ซ้ำกัน)
409idempotency_conflictIdempotency-Key ใช้ซ้ำกับ body ต่างกัน
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 สำหรับ endpoint ที่ไม่ต้องยืนยันตัวตน) ถังโทเค็นแบบ GCRA:

  • Auth/auth/*: 0.5 req/s burst 20
  • Public/contact, /feedback: 0.2 req/s burst 10
  • Sensitive — การรีเซ็ตรหัสผ่าน: ~0.002 req/s burst 5

การเกินขีดจำกัดคืน 429 Too Many Requests พร้อม header Retry-After และ body แบบ ข้อความธรรมดา (ไม่ใช่ซองข้อผิดพลาด JSON)