Skip to content

Spesifikasi API

Rujukan endpoint REST yang lengkap. Untuk tutorial dan contoh, lihat Panduan API.

Segala yang ahli projek boleh lakukan dalam UI web tersedia di sini — SPA menggunakan API yang sama ini. Operasi yang memerlukan peranan owner ditandakan (owner); segala yang lain hanya memerlukan keahlian projek (atau, untuk bacaan yang ditandakan (viewer), mana-mana tahap akses).

https://eastagiletracker.com/api/v1

https://api.eastagiletracker.com/api/v1 menghidangkan API yang serupa. Semua permintaan dan respons adalah JSON, kecuali beberapa endpoint muat-naik-fail yang menerima multipart.

Setiap permintaan yang disahkan menghantar kunci API melalui salah satu daripada:

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

Kunci pengguna bermula dengan ea_user_. Kunci ejen bermula dengan ea_agent_. Lihat Panduan API → Dua jenis kunci.

Endpoint tidak disahkan: /openapi.json, /docs, endpoint /auth/*, dan carian rujukan-data (/story_types, /story_states, /effort_scales, …). /meta adalah disahkan — mana-mana kunci yang sah berfungsi, tetapi ia tidak berskop-projek (kunci ejen terikat-projek juga mencapainya).

Tiga tahap mengawal endpoint berskop-projek:

TahapSiapa yang lulusOperasi tipikal
viewerviewer, member, ownerbacaan (senarai/dapat story, carian, analitik)
membermember, ownersemua penulisan item-kerja (story, tugas, ulasan, …)
ownerowner sahajatetapan projek, pengurusan keahlian, kunci ejen, padam, import, log audit

Bukan ahli menerima 404 unfound_resource (bukan 403) pada laluan projek, jadi ID projek tidak boleh dibilang.

KaedahLaluanPenerangan
GET/openapi.jsonSpesifikasi OpenAPI 3 langsung. Tidak disahkan.
GET/docsSwagger UI. Tidak disahkan.
GET/metaIdentiti pemanggil (auth.kind/key_id/agent_id/project_id) + graf peralihan jenis-story. Disahkan (mana-mana kunci yang sah; bukan berskop-projek). Panggil ini dahulu.

Ini bertindak pada pemanggil dan hanya memerlukan kunci yang sah (tiada peranan projek).

KaedahLaluanPenerangan
POST/auth/registerDaftar akaun baharu
POST/auth/loginDaftar masuk, memulangkan token sesi
POST/auth/logoutDaftar keluar
POST/auth/forgot-passwordMinta e-mel tetap-semula kata laluan
POST/auth/reset-passwordGunakan token tetap semula untuk menetapkan kata laluan baharu
GET/auth/verify-emailSahkan alamat e-mel
POST/auth/accept-invite/lookupSelesaikan token jemputan → e-mel (tidak disahkan)
POST/auth/accept-inviteTerima jemputan projek (selepas pengesahan)
GET/meProfil pengguna semasa
PUT/meKemas kini profil
DELETE/mePadam akaun
PUT/me/passwordTukar kata laluan
PUT/me/settingsKemas kini tetapan (tema, keutamaan pemberitahuan)
POST/me/avatarMuat naik avatar (multipart)
POST/me/api-token/regeneratePutar token API anda — membatalkan sesi/kunci sedia ada
GET/me/api_keys · POST /me/api_keys · DELETE /me/api_keys/{id}Urus kunci API pengguna (ea_user_)
GET/me/activityAktiviti anda merentasi semua projek
GET/me/data-exportEksport-sendiri GDPR data anda
GET/me/consent · POST /me/consentBaca / rekod persetujuan ({ consent_type, granted })
GET/legal/pending · POST /legal/acceptDokumen clickwrap tertangguh / rekod penerimaan
POST/contact · POST /feedback · POST /feedback/with-screenshotHubungi + maklum balas dalam-aplikasi

Carian benih digunakan semasa mencipta/menganggar story. ID stabil.

KaedahLaluanPenerangan
GET/story_typesfeature, bug, chore, release (+ allow_points)
GET/story_statesunstarted … accepted, rejected
GET/effort_scalesskala anggaran yang tersedia
GET/effort_scales/{scale_id}/valuesnilai mata dalam skala
KaedahLaluanPenerangan
GET/projectsSenaraikan projek anda
POST/projectsCipta projek
GET/projects/{id}Dapatkan butiran projek (viewer)
PUT/projects/{id}Kemas kini tetapan projek (owner)
DELETE/projects/{id}Padam projek (owner)
GET/projects/{id}/audit-logAliran aktiviti projek (owner)
GET/projects/{id}/eventsAliran peristiwa berhalaman-kursor (viewer) — lihat Peristiwa
KaedahLaluanPenerangan
GET/projects/{id}/membershipsSenaraikan ahli (viewer)
POST/projects/{id}/membershipsJemput ahli melalui e-mel (owner)
PUT/projects/{id}/memberships/{mid}Kemas kini peranan (owner)
DELETE/projects/{id}/memberships/{mid}Keluarkan ahli (owner)
GET / POST/projects/{id}/agent_keysSenaraikan / cetak kunci ejen (owner)
DELETE/projects/{id}/agent_keys/{kid}Batalkan kunci ejen (owner)

Semua penulisan story memerlukan peranan member.

KaedahLaluanPenerangan
GET/projects/{id}/storiesSenaraikan story (berhalaman, boleh ditapis) (viewer)
POST/projects/{id}/storiesCipta story
GET/projects/{id}/stories/{sid}Dapatkan satu story (viewer)
PUT/projects/{id}/stories/{sid}Kemas kini story
DELETE/projects/{id}/stories/{sid}Padam story
POST/projects/{id}/stories/{sid}/transitionsTukar keadaan dengan pengesahan
POST/projects/{id}/stories/bulk_transitionUbah banyak story (1–100) sekaligus
POST/projects/{id}/stories/bulk-deletePadam banyak story
POST/projects/{id}/stories/bulk-duplicatePendua banyak story
POST/projects/{id}/stories/{sid}/duplicatePendua satu story

Cipta (POST …/stories): { "name" (required), "story_type": "feature|bug|chore|release", "description"?, "estimate"?, "current_state"?, "icebox"?, "labels"? }. labels menerima ["auth"] atau [{ "name": "auth" }]; label tidak diketahui dicipta. Lalai: story_type=feature, current_state=unstarted.

Kemas kini (PUT …/stories/{sid}): medan yang sama, semua pilihan, ditambah "position" (float) dan "force_state_change" (bool).

Peralihan (POST …/transitions): { "to": "<state>", "reason"? }. Medan ialah to. Memulangkan { story_id, state }. Gerakan tidak sah → 422 invalid_transition dengan details: { from, to, allowed }.

Peralihan pukal (POST …/bulk_transition): { "story_ids": [int,…] (1–100), "to": "<state>", "reason"? }. Setiap story dihakimi secara bebas; memulangkan { results: [ { id, status: "ok" } | { id, status: "failed", error } ] }.

Semua member. Senarai/GET pada kebanyakannya ialah (viewer).

KaedahLaluanBadan / nota
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) } atau { 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? } — tinggalkan kedua-duanya untuk menambah pemanggil
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}muat naik multipart (≤ 2 GB setiap satu); senarai ialah (viewer)

member untuk penulisan, (viewer) untuk bacaan.

KaedahLaluanPenerangan
GET / POST/projects/{id}/labelsSenaraikan / cipta label
PUT / DELETE/projects/{id}/labels/{lid}Kemas kini / padam label
POST/projects/{id}/labels/{lid}/archiveArkib (sembunyi-lembut) label
KaedahLaluanPenerangan
GET/projects/{id}/iterationsSenaraikan iterasi (member)
POST/projects/{id}/iterationsCipta iterasi manual (owner)
DELETE/projects/{id}/iterations/{itid}Padam iterasi (owner)
KaedahLaluanPenerangan
GET/projects/{id}/search?query=…Carian sintaks penapis (viewer) — lihat Panduan
GET/projects/{id}/analytics/{overview,iteration,releases,activity,cycle-time,projections}Analitik (viewer). Penelitian iterasi mengambil ?iteration_id=
GET/projects/{id}/metrics/{velocity,burndown,story-types}Metrik (viewer)
GET / PUT/projects/{id}/preferencesKeutamaan papan anda untuk projek ini (member)
KaedahLaluanPenerangan
GET/projects/{id}/eventsAliran peristiwa berhalaman-kursor (viewer)

Parameter pertanyaan: since=<event_id>, types=story.created,story.transitioned,comment.created,…, limit=, cursor=. Respons termasuk next_cursor. Hantar event_id terakhir yang anda lihat sebagai since untuk menyambung.

KaedahLaluanPenerangan
POST/projects/{id}/import (+ /json)Muat naik multipart. source=pivotal, jira, asana, gitlab, shortcut, trello, linear, plane, plane_json.
wss://eastagiletracker.com/ws/control?token=<key>

Untuk kawalan-jauh UI interaktif ({ "action": "get_state", "id": "req-1" }). Bukan saluran data — semua bacaan/penulisan melalui REST. Satu-instance sahaja; tidak disebarkan merentasi replika.

Endpoint penulisan (POST, PUT, DELETE) menerima pengepala Idempotency-Key. Kunci yang sama + badan yang sama memainkan semula respons tercache (tetingkap 24 jam); kunci yang sama + badan yang berbeza memulangkan 409 idempotency_conflict. Tidak digunakan pada laluan GET/HEAD/OPTIONS, /auth/*, atau /attachments. Respons 5xx tidak pernah dicache — cuba semula mencapai pengendali.

Endpoint senarai menerima cursor=<opaque> dan limit=<n≤200>. Apabila ditetapkan, respons ialah { "items": [...], "next_cursor": "<str|null>" }; hantar next_cursor kembali untuk menghalamankan. Sesetengah senarai juga memulangkan pengepala X-Tracker-Pagination-Total.

Endpoint senarai menerima fields= (dipisahkan koma) untuk memulangkan hanya medan tertentu. story_id sentiasa disertakan; nama medan tidak diketahui memulangkan 400 validation_failed dengan nama yang menyalahi dalam details.fields.

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

Setiap ralat JSON mempunyai code dan error; sesetengahnya menambah details:

{ "code": "invalid_transition",
"error": "Cannot move story from `unstarted` to `accepted`",
"details": { "from": "unstarted", "to": "accepted", "allowed": ["started"] } }
StatuscodeBila
400invalid_parameterinput buruk; mesej dalam error, tiada details (kebanyakan pengesahan: kosong/panjang/null-byte/e-mel)
400validation_failedralat input berstruktur; details.fields ialah tatasusunan nama medan yang menyalahi
401unauthenticatedtoken hilang/tidak sah
403unauthorized_operationdisahkan tetapi peranan tidak mencukupi
404unfound_resourcetidak ditemui — juga dipulangkan kepada bukan ahli
409conflictkonflik sumber (cth. pendua)
409idempotency_conflictIdempotency-Key diguna semula dengan badan yang berbeza
422invalid_transitiongerakan keadaan tidak sah; details membawa { from, to, allowed }
500internal_errorkesalahan pelayan — mesej generik; selamat untuk cuba semula

details.fields ialah tatasusunan JSON nama medan (cth. ["to"]), kadangkala dengan kunci tambahan seperti max. Tiada peta medan→mesej.

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

Setiap kunci (setiap IP untuk endpoint tidak disahkan), baldi token GCRA:

  • Auth/auth/*: 0.5 req/s, ledakan 20.
  • Awam/contact, /feedback: 0.2 req/s, ledakan 10.
  • Sensitif — tetap-semula kata laluan: ~0.002 req/s, ledakan 5.

Had yang melebihi memulangkan 429 Too Many Requests dengan pengepala Retry-After dan badan teks-biasa (bukan sampul ralat JSON).